gpt4 book ai didi

haskell - Haskell 中的多行是什么?一个操作符,一个函数,还是别的什么?

转载 作者:行者123 更新时间:2023-12-04 17:07:07 25 4
gpt4 key购买 nike

我对 Haskell 很陌生,我必须说我很困惑

我正在使用 GHCi prelude

第一次尝试创建阶乘

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 函数的结果来看,它们似乎至少导致完全相同的定义。

最佳答案

why the first one is wrong, what happen in this case



因为你定义了 两个函数同名。

首先你定义:
factorial 0 = 1

稍后你定义:
factorial n = n*factorial(n-1)

但是 Haskell 会将第二个阶乘视为范围更局部的变量,因此第二个函数定义隐藏了前一个。第一行( factorial 0 = 1 )因此不再是定义的一部分。因此 Haskell 将评估 factorial 2 -> 2 * factorial 1 -> 2 * 1 * factorial 0 -> 2 * 1 * 0 * factorial (-1) -> ... .

why the 2nd and the 3rd are working



因为这里定义了一个函数,而 Haskell 将这两个子句解释为同一个函数的两个子句。事实与 :t function你得到的一样,只是巧合。

请注意,以上仅对 GHCi 有效。如果您使用 ghc编译器,它当然会将您的所有语句视为同一函数定义的一部分。如果您混合使用两个函数的子句(例如,首先是 a 0 = 0 ,然后是 b 0 = 0 ,然后是 a n = n ),则会出现关于 * 同一函数的多个定义的错误)。

关于haskell - Haskell 中的多行是什么?一个操作符,一个函数,还是别的什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com