我想了解 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 中的优先规则。当我编写代码行“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)
不被接受。
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))一个字符串,但事实真的是这样吗?