如何跨多行在ghci中定义函数?

我正在尝试定义任何简单的函数来跨越ghci中的多行,请以以下示例为例:


let abs n | n >= 0 = n

          | otherwise = -n

到目前为止,我已经尝试在第一行之后按Enter键:


Prelude> let abs n | n >= 0 = n

Prelude>           | otherwise = -n

<interactive>:1:0: parse error on input `|'

我也尝试过使用:{and :}命令,但距离并不远:


Prelude> :{

unknown command ':{'

use :? for help.

我在Linux上使用适用于Haskell 98的GHC Interactive 6.6版,我缺少什么?



慕村9548890
浏览 412回答 3
3回答

九州编程

对于后卫(如您的示例),您可以将它们全部放在一行上,这样就可以工作(后卫不在乎间距)let abs n | n >= 0 = n | otherwise = -n如果您想使用多个与参数匹配的定义来编写函数,例如:fact 0 = 1fact n = n * fact (n-1)那么您将用大括号和分号分隔定义let { fact 0 = 1 ; fact n = n * fact (n-1) }

有只小跳蛙

GHCi现在具有多行输入模式,已通过:set + m启用。例如,Prelude> :set +mPrelude> let fac 0 = 1Prelude|&nbsp; &nbsp; &nbsp;fac n = n * fac (n-1)Prelude|Prelude> fac 103628800

料青山看我应如是

丹是正确的,但:{并:}必须在每个出现在自己的行:> :{&nbsp;> let foo a b = a +>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b> :}> :t foofoo :: (Num a) => a -> a -> a这也与布局规则交互,因此在使用do表示法时,显式使用花括号和分号可能会更容易。例如,此定义失败:> :{| let prRev = do|&nbsp; &nbsp;inp <- getLine|&nbsp; &nbsp;putStrLn $ reverse inp| :}<interactive>:1:18:&nbsp; &nbsp; The last statement in a 'do' construct must be an expression但是在添加括号和分号时可以使用:> :{| let prRev = do {|&nbsp; &nbsp;inp <- getLine;|&nbsp; &nbsp;putStrLn $ reverse inp;| }| :}> :t prRevprRev :: IO ()仅当从文件中粘贴定义(缩进可能会更改)时,这才真正重要。
打开App,查看更多内容
随时随地看视频慕课网APP