gpt4 book ai didi

haskell - GHCi中特殊情况下的函数定义

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

来自 Haskell tutorial :

We can write functions on integers by cases.

-- Compute the sum of the integers from 1 to n.
sumtorial :: Integer -> Integer
sumtorial 0 = 0
sumtorial n = n + sumtorial (n-1)


但是,当我尝试它时会发生以下情况:
$ ghci
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
Prelude> foo 0 = print 999
Prelude> foo n = print n
Prelude> foo 0
0

我错过了什么?

最佳答案

要在 GHCi 中完全按照它们的编写方式使用这些定义(即在单独的行中使用多个方程或类型签名),您需要通过 :{ 在 GHCi 中使用多行输入。和 :}分隔符:

GHCi> :{
GHCi| foo 0 = print 999
GHCi| foo n = print n
GHCi| :}
GHCi> foo 0
999

一种替代方法是使用 +m 在 session 的其余部分启用多行输入。选项。但是,在这种情况下,您还需要显式 let ,因为没有它,GHCi 将无法确定您是否要继续定义:
GHCi> :set +m
GHCi> let foo 0 = print 999
GHCi| foo n = print n
GHCi|
GHCi> foo 0
999

(您可以使用 +m 关闭 :unset +m。)

另一种可能性是完全避免换行,并使用显式大括号和分号:
GHCi> foo 0 = print 999; foo n = print n
GHCi> foo 0
999

在多行输入选项之间,我个人更喜欢 :{:}超过 +m ,因为它们在我通常如何表达我的定义方面需要较少的更改,并且如果我从其他地方粘贴代码,它们更有可能立即工作。

至于为什么你的输入方式不起作用,这是因为,除非你使用多行输入,否则在不同的 GHCi 行中绑定(bind)到相同的名称会相互影响:
GHCi> x = 3
GHCi> x = 4
GHCi> x
4

如果我们注意到我们从 let 的链中得到相同的行为,这似乎就不那么令人惊讶了。 - 表达式:
GHCi> let x = 3 in let x = 4 in x
4

关于haskell - GHCi中特殊情况下的函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42593284/

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