让 Multiline haskell 函数在 ghci 中工作
Getting Multiline haskell function to work in ghci
我创建了这个 haskell 函数来从列表中删除奇数,并在 ghci 中尝试。尽管我启用了多行模式并使用 4 个空格进行缩进,但我仍然收到以下错误。
Prelude> :set +m
Prelude> let removeOdds nums =
Prelude| if null nums
Prelude| then []
Prelude| else
Prelude| if (mod (head nums)/2) == 0
Prelude| then (head nums) : (removeOdds(tail nums))
Prelude| else removeOdds(tail nums)
Prelude|
:11:5:
解析错误(可能是缩进不正确或括号不匹配)
我阅读了 this 页面,了解新手通常会犯的错误,并按如下方式更改了我的代码
Prelude> let removeOdds nums =
Prelude| do if null nums
Prelude| then []
Prelude| else
Prelude| do if mod((head nums)/2) == 0
Prelude| then head nums: removeOdds(tail nums)
Prelude| else removeOdds(tail nums)
Prelude|
<interactive>:47:5:
parse error (possibly incorrect indentation or mismatched brackets)
现在我以一个新的错误结束了。在 haskell 中,缩进似乎很难解决。
您的 if
语句需要至少缩进一个 space:
Prelude> let removeOdds nums =
Prelude| if null nums
Complete example:
Prelude> let removeOdds nums =
Prelude| if null nums
Prelude| then []
Prelude| else
Prelude| if (mod (head nums) 2) == 0
Prelude| then (head nums) : (removeOdds(tail nums))
Prelude| else removeOdds(tail nums)
Prelude|
Prelude>
可能还需要注意的是,如果您不在 REPL 中因此不需要 let
,那么您不需要那么多缩进:
removeOdds nums =
if null nums
then []
else
if (mod (head nums) 2) == 0
then (head nums) : (removeOdds(tail nums))
else removeOdds(tail nums)
我在 GHCi 中定义多行函数时使用花括号。它们允许您像通常编写的那样粘贴一大块 Haskell 代码。
λ :{
| let
| -- type or paste here, e.g.,
| removeOdds :: Integral a => [a] -> [a]
| removeOdds nums =
| if null nums
| then []
| else -- ...
| :}
λ removeOdds [1,2,3,4]
[2,4]
我创建了这个 haskell 函数来从列表中删除奇数,并在 ghci 中尝试。尽管我启用了多行模式并使用 4 个空格进行缩进,但我仍然收到以下错误。
Prelude> :set +m
Prelude> let removeOdds nums =
Prelude| if null nums
Prelude| then []
Prelude| else
Prelude| if (mod (head nums)/2) == 0
Prelude| then (head nums) : (removeOdds(tail nums))
Prelude| else removeOdds(tail nums)
Prelude|
:11:5: 解析错误(可能是缩进不正确或括号不匹配)
我阅读了 this 页面,了解新手通常会犯的错误,并按如下方式更改了我的代码
Prelude> let removeOdds nums =
Prelude| do if null nums
Prelude| then []
Prelude| else
Prelude| do if mod((head nums)/2) == 0
Prelude| then head nums: removeOdds(tail nums)
Prelude| else removeOdds(tail nums)
Prelude|
<interactive>:47:5:
parse error (possibly incorrect indentation or mismatched brackets)
现在我以一个新的错误结束了。在 haskell 中,缩进似乎很难解决。
您的 if
语句需要至少缩进一个 space:
Prelude> let removeOdds nums =
Prelude| if null nums
Complete example:
Prelude> let removeOdds nums =
Prelude| if null nums
Prelude| then []
Prelude| else
Prelude| if (mod (head nums) 2) == 0
Prelude| then (head nums) : (removeOdds(tail nums))
Prelude| else removeOdds(tail nums)
Prelude|
Prelude>
可能还需要注意的是,如果您不在 REPL 中因此不需要 let
,那么您不需要那么多缩进:
removeOdds nums =
if null nums
then []
else
if (mod (head nums) 2) == 0
then (head nums) : (removeOdds(tail nums))
else removeOdds(tail nums)
我在 GHCi 中定义多行函数时使用花括号。它们允许您像通常编写的那样粘贴一大块 Haskell 代码。
λ :{
| let
| -- type or paste here, e.g.,
| removeOdds :: Integral a => [a] -> [a]
| removeOdds nums =
| if null nums
| then []
| else -- ...
| :}
λ removeOdds [1,2,3,4]
[2,4]