【发布时间】:2017-11-07 09:45:23
【问题描述】:
我对 Haskell 很陌生,我必须说我很困惑
我正在使用 GHCi 前奏
第一次尝试创建阶乘
Prelude> factorial 0 = 1
Prelude> factorial n = n*factorial(n-1)
Prelude> factorial 2
*** Exception: stack overflow
以堆栈溢出结束。显然递归并没有停止。
Prelude> :t factorial
factorial :: Num t => t -> t
然后阅读这篇文章How to define a function in ghci across multiple lines?
我发现我必须使用多行版本或大括号(顺便说一下,这是一个运算符吗?)
Prelude> let { fact 0 = 1 ; fact n = n * fact (n-1) }
Prelude> fact 5
120
Prelude> ::t fact
fact :: (Eq p, Num p) => p -> p
或
Prelude> :{
Prelude| facto 0 = 1
Prelude| facto n = n*facto(n-1)
Prelude| :}
Prelude> facto 4
24
Prelude> :t facto
facto :: (Eq p, Num p) => p -> p
所以,我的问题是,为什么第一个是错误的,在这种情况下会发生什么,为什么第二个和第三个正在工作,从 :t 函数的结果来看,它们似乎至少导致了准确的相同的定义。
【问题讨论】:
-
不,它只是语法。
-
:{和:}甚至都不是语法。它们是 GHCi 的命令。 -
我发现编辑文本文件然后(重新)加载到 ghci 中更方便。不需要所有这些括号,也不需要像这样的惊喜!
标签: haskell