小编Fty*_*upl的帖子

在 Haskell 中共享数据

我想了解 Haskell 中的内存共享机制是如何工作的。事实上,编写计算斐波那数列项的函数的方法是:

fibo' n = f n
  where 
    f 0 = 1
    f 1 = 1
    f n = fibs !! (n-1) + fibs !! (n-2)
    fibs = [f x | x <- [0..]]
Run Code Online (Sandbox Code Playgroud)

这假设有一个改进,即小纤维列表不会多次评估,而是在调用之间共享,但我不确定这个假设或其工作原理。

haskell functional-programming data-sharing

4
推荐指数
1
解决办法
163
查看次数

Haskell - 操作优先级

我试图弄清楚 Haskell 中的优先规则。当我编写代码行“fa b”时,它将被解释为 (fa) b,即使用左关联机制。

但让我们想象一下,我正在 Haskell 中编写一个计算斐波那契序列项的函数。然后我运行以下程序:

fibo 0 = 1
fibo 1 = 1
fibo n = fibo(n-1) + fibo(n-2)
Run Code Online (Sandbox Code Playgroud)

对于最后一个表达式,这将被解释为:

(((fibo(n-1))+)fibo)(n-2))
Run Code Online (Sandbox Code Playgroud)

为什么获取第二个 fibo 时没有错误。在将结果作为函数 (+) 的参数给出之前,编译器如何知道 fibo 必须应用于 (n-2)?与算术运算符有关吗?

我对 ghci 和语法进行了很多测试

g = fibo 2 + fibo
Run Code Online (Sandbox Code Playgroud)

不被接受。

haskell functional-programming operator-precedence

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

Haskell `linesCut` 函数 - 为什么最后一行会导致类型问题,以及如何修复它?

linesCut :: String -> [String]
linesCut "" = [""]
linesCut (x:xs)
   |x == '\n' = [""] ++ linesCut xs
   |otherwise = x: (head (linesCut xs))
Run Code Online (Sandbox Code Playgroud)

我想了解编译这样的函数引起的类型问题。为什么最后一行有类型问题?

我的印象是它是一个Char并且是(head (linesCut xs))一个字符串,但事实真的是这样吗?

haskell

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