Tag: 哈斯克尔

如何使用Haskell在列表中分组类似的项目?

给出这样的元组列表: dic = [(1,"aa"),(1,"cc"),(2,"aa"),(3,"ff"),(3,"gg"),(1,"bb")] 如何分组的项目产生一个列表grp在哪里, grp = [(1,["aa","bb","cc"]), (2, ["aa"]), (3, ["ff","gg"])] 我其实是Haskell的新手…似乎正在爱上它.. 在Data.List中使用group或groupBy将只分组列表中的相似的相邻项目。 我为此写了一个低效率的函数,但是由于我需要处理一个非常大的编码string列表,所以导致内存失败。 希望你能帮我find一个更有效的方法。

在Haskell中记忆?

任何关于如何在Haskell中有效地解决以下函数的指针,对于大数目(n > 108) f(n) = max(n, f(n/2) + f(n/3) + f(n/4)) 我已经看到了Haskell中的memoization的例子来解决斐波纳契数字,其中包括计算(懒洋洋地)所有的斐波纳契数字到所需的n。 但在这种情况下,对于给定的n,我们只需要计算非常less的中间结果。 谢谢

显式导入实例

我如何显式导入types类实例? 另外,如何通过合格的导入来执行此操作? 目前,我在做 import Control.Monad.Error () 导入我可以使用的monad实例(Either String) 。 以前,我用过 import Control.Monad.Error 我不满意任何一个,因为Monad实例是隐式导入的。

为什么3和x(被分配了3)在Haskell中有不同的推断types?

Haskell中的types推理有一点学习曲线(至less可以说!)。 开始学习的一个好方法是用简单的例子。 所以,以下是一个types推理的“hello world”。 考虑下面的例子: Prelude> :t 3 3 :: (Num t) => t Prelude> let x = 3 Prelude> :tx x :: Integer 问题是: 为什么3和x有不同的types? 链接总结: 阅读下面的答案全文; 这里只是一个链接总结: GHCtypes违约: Haskell报告部分4.3.4 GHCi的扩展types违约: 使用GHCi部分2.4.5 单态限制: Haskell wiki

GHCi中的多行命令

我有问题在ghci中input多行命令。 以下2行代码从文件中工作: addTwo :: Int -> Int -> Int addTwo xy = x + y 但是当我inputghci,我得到错误。 我也尝试把代码放在里面:{ … :} ,但是它们也不适用于这个例子,因为这只是将行附加到一行中,而不应该是这样。 我正在使用WinGHCi,版本2011.2.0.1

Haskell函数组成(。)和函数应用($)成语:正确使用

我一直在阅读真实世界的Haskell ,而且我已经接近尾声,但风格的问题一直在与我(.)和($)运算符做一个小问题。 当你编写一个其他函数组成的函数时,你可以这样写: f = g . h 但是,当你将这些function应用到最后时,我会这样写: k = a $ b $ c $ value 但是这本书会这样写: k = a . b . c $ value 现在,对我来说,他们看起来在function上是相同的,他们在我眼中完全一样。 然而,我看的越多,我就越是看到人们按照本书的方式编写自己的function:先用(.)编写,然后在最后使用($)来附加一个值来评估这个地段(没有人它与许多美元成分)。 是否有使用书籍方式比使用所有($)符号好得多的原因? 还是有没有一些最好的做法,我没有得到? 或者是多余的,我不应该担心它呢?

foldl与foldr行为与无限列表

这个问题中 myAny函数的代码使用了foldr。 当谓词满足时,它停止处理无限列表。 我用foldl重写了它: myAny :: (a -> Bool) -> [a] -> Bool myAny p list = foldl step False list where step acc item = p item || acc (请注意,step函数的参数正确颠倒了。) 但是,它不再停止处理无限列表。 我试图跟踪Apocalisp答案中的函数执行情况: myAny even [1..] foldl step False [1..] step (foldl step False [2..]) 1 even 1 || (foldl step False [2..]) False || […]

(具有certificate)显示monad没有closures的具体例子?

众所周知,应用函子在构图下是封闭的,但monad不是。 然而,我一直无法find一个具体的反例,表明monad并不总是构成。 这个答案给出了[String -> a]作为非monad的例子。 在玩了一下之后,我直觉地相信,但是这个答案只是说“连接不能实现”而没有给出任何理由。 我想要更正式的东西。 当然还有很多types为[String -> [String -> a]] -> [String -> a]的函数。 必须表明任何这样的function必然不符合单子法。 任何示例(附带certificate)都可以; 我不一定特别寻找上述例子的certificate。

用不同数量的参数定义一个函数

我今天注意到这样一个定义 safeDivide x 0 = x safeDivide = (/) 不可能。 我只是好奇这背后的(好)理由是什么。 必须有一个非常好的(毕竟是Haskell :))。 注意:我不想看上面的代码的替代实现的build议,这是一个简单的例子来certificate我的观点。

这个fibonacci函数是如何记忆的?

通过什么机制是这种斐波那契函数memoized? fib = (map fib' [0..] !!) where fib' 1 = 1 fib' 2 = 1 fib' n = fib (n-2) + fib (n-1) 并在相关的说明,为什么这个版本不是? fib n = (map fib' [0..] !! n) where fib' 1 = 1 fib' 2 = 1 fib' n = fib (n-2) + fib (n-1)