小编luq*_*qui的帖子

`Monad((,)w)`实例是否符合标准?

我一直使用这对拼写Writer,但我总是要实例化自己:

instance (Monoid w) => Monad ((,) w) where
    return x = (mempty, x)
    ~(w,x) >>= f = let (w', y) = f x in (w `mappend` w', y)
Run Code Online (Sandbox Code Playgroud)

这是否存在于标准库中的任何位置?

monads haskell

19
推荐指数
1
解决办法
695
查看次数

Haskell中的尾递归

我试图理解Haskell中的尾递归.我想我明白它是什么以及它是如何工作的但是我想确保我没有搞砸了.

这是"标准"因子定义:

factorial 1 = 1
factorial k = k * factorial (k-1)
Run Code Online (Sandbox Code Playgroud)

例如,在运行时,factorial 3我的函数会自行调用3次(给它或者拿它).如果我想计算因子99999999,这可能会产生问题,因为我可能有堆栈溢出.在我到达之后,factorial 1 = 1我将不得不在堆栈中"返回"并将所有值相乘,因此我有6个操作(3个用于调用函数本身,3个用于乘以值).

现在我向您介绍另一种可能的因子实现:

factorial 1 c = c
factorial k c = factorial (k-1) (c*k)
Run Code Online (Sandbox Code Playgroud)

这个也是递归的.它会称自己为3次.但它没有问题,然后仍然必须"回来"计算所有结果的乘法,因为我已经将结果作为函数的参数传递.

根据我的理解,这就是Tail Recursion的内容.现在,它似乎比第一个好一点,但你仍然可以轻松地拥有堆栈溢出.我听说Haskell的编译器会在后台将Tail-Recursive函数转换为for循环.我想这就是为什么它能够为尾递归功能付出代价呢?

如果这就是原因,那么如果编译器不打算做这个聪明的技巧,那么绝对没有必要尝试使函数尾递归 - 我是对的吗?例如,虽然理论上C#编译器可以检测并将尾递归函数转换为循环,但我知道(至少是我所听到的)目前它没有这样做.所以现在绝对没有必要使函数尾递归.是吗?

谢谢!

recursion haskell tail-recursion

18
推荐指数
2
解决办法
8163
查看次数

"松散的monoidal仿函数"中"松散"是什么意思?

我知道这个Applicative类在类别理论中被描述为"松散的monoidal仿函数",但我之前从未听过"lax"这个术语,并且关于松散仿函数nlab页面是一堆我根本不认识的东西,re:在Haskell,我不知道我们关心的双类和事物.如果它实际上是关于bicategories,有人可以给我一个plebian视图,这意味着什么?否则,这个名字的"松懈"是什么?

haskell category-theory applicative

18
推荐指数
1
解决办法
308
查看次数

这些类似Free的结构是否有概括?

我正在玩弄类似自由的想法,并发现了这个:

{-# LANGUAGE RankNTypes #-}

data Monoid m = Monoid { mempty :: m, mappend :: m -> m -> m }
data Generator a m = Generator { monoid :: Monoid m, singleton :: a -> m }

newtype Free f = Free { getFree :: forall s. f s -> s }

mkMonoid :: (forall s. f s -> Monoid s) -> Monoid (Free f)
mkMonoid f = Monoid {
    mempty = Free (mempty . f),
    mappend = …
Run Code Online (Sandbox Code Playgroud)

haskell category-theory free-monad

16
推荐指数
1
解决办法
628
查看次数

用于生成列表的所有前缀的最有效的纯函数算法是什么?

prefixes ls = zipWith take [1 .. length ls] (repeat ls)
Run Code Online (Sandbox Code Playgroud)

有什么方法比这更好吗?直觉上,在我看来,在纯函数式语言中无法获得低于O(n²)的算法,因为反向或追加必须应用n次.但我不知道如何证明这一点.

algorithm performance haskell functional-programming

13
推荐指数
1
解决办法
938
查看次数

Vim魔术关闭支架

如果我可以输入](或者其他一些字符<C-]>)并且自动插入任何支架正确关闭开口支架,那么在vim中会很棒.例如.如果我在缓冲区中有这个:

object(function(x) { x+[1,2,3
Run Code Online (Sandbox Code Playgroud)

我按]]],]})将插入字符.怎么可能实现这个呢?

vim

13
推荐指数
1
解决办法
1165
查看次数

Agda的递归方案

毋庸置疑,Haskell的标准结构

newtype Fix f = Fix { getFix :: f (Fix f) }

cata :: (Functor f) => (f a -> a) -> Fix f -> a
cata f = f . fmap (cata f) . getFix 
Run Code Online (Sandbox Code Playgroud)

太棒了,非常有用.

试图在Agda中定义类似的东西(我只是为了完整起见)

data Fix (f : Set -> Set) : Set where
    mkFix : f (Fix f) -> Fix f
Run Code Online (Sandbox Code Playgroud)

失败,因为f不一定是严格积极的.这是有道理的 - 通过适当选择,我很容易从这种结构中得到一个矛盾.

我的问题是:在Agda编码递归方案有什么希望吗?它完成了吗?需要什么?

recursion haskell agda catamorphism recursion-schemes

12
推荐指数
1
解决办法
903
查看次数

如何将postgres数据库转换为sqlite

我们正在开发一个网站,当我们在本地开发时(我们中的一个来自Windows),我们使用sqlite3,但在服务器(linux)上我们使用postgres.我们希望能够将生产数据库导入到我们的开发过程中,所以我想知道是否有一种方法可以将postgres数据库转换转换为sqlite3可以理解的东西(只是将它添加到postgres的转储SQL中给了很多,许多错误).或者只是在Windows上安装postgres会更容易吗?谢谢.

database sqlite postgresql

11
推荐指数
6
解决办法
3万
查看次数

Haskell中的Point Free问题

我试图将以下haskell代码转换为点自由风格,但没有用.

bar f g xs = filter f (map g xs )
Run Code Online (Sandbox Code Playgroud)

我是哈斯凯尔的新手,任何帮助都会很棒

haskell

11
推荐指数
3
解决办法
633
查看次数

消除Haskell的策略

我正在为纯功能程序开发虚拟机,我希望能够测试和使用已有的各种Haskell模块.VM在无类型lambda演算中基本上作为输入.我想知道从现代Haskell模块中提取这样一个表示的好方法(例如,使用MPTC,模式保护等).我做了一点研究,似乎没有一个工具可以做到这一点(我会很高兴被误解),这没关系.我正在寻找一种方法.

GHC Core似乎过于注重操作,特别是因为VM所做的一件事就是显着改变评估顺序.是否有任何可访问的中间表示更接近于lambda演算?

compiler-construction haskell lambda-calculus

10
推荐指数
1
解决办法
700
查看次数