如何在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 `|' 

我也试图使用:{:}命令,但我没有得到太多:

 Prelude> :{ unknown command ':{' use :? for help. 

我在Linux上使用GHC交互版本6.6的Haskell 98,我错过了什么?

对于守卫(就像你的例子),你可以把他们全部放在一条线上,它可以工作(守卫不关心间距)

 let abs n | n >= 0 = n | otherwise = -n 

如果你想用你的函数写出多个模式匹配的参数,像这样:

 fact 0 = 1 fact n = n * fact (n-1) 

那么你会使用分号分隔定义的花括号

 let { fact 0 = 1 ; fact n = n * fact (n-1) } 

GHCi现在有一个多行input模式,启用:set + m。 例如,

 Prelude> :set +m Prelude> let fac 0 = 1 Prelude| fac n = n * fac (n-1) Prelude| Prelude> fac 10 3628800 

丹是正确的,但是:{:}必须各自出现在他们自己的路线上:

 > :{ > let foo ab = a + > b > :} > :t foo foo :: (Num a) => a -> a -> a 

这也与布局规则相互作用,所以当使用do-notation时,明确地使用大括号和分号可能更容易。 例如,这个定义失败了:

 > :{ | let prRev = do | inp <- getLine | putStrLn $ reverse inp | :} <interactive>:1:18: The last statement in a 'do' construct must be an expression 

但是,当大括号和分号被添加时,

 > :{ | let prRev = do { | inp <- getLine; | putStrLn $ reverse inp; | } | :} > :t prRev prRev :: IO () 

从文件中粘贴定义时,这只会非常重要,缩进可能会改变。

它看起来像:{:}是一个相当新的function。 您可能需要升级GHC。

编辑:确认,见http://www.haskell.org/ghc/docs/6.8.2/html/users_guide/release-6-8-2.html

如果您不想仅为:{ :}升级GHC,则需要将其全部写入一行:

 > let abs' n | n >= 0 = n | otherwise = -n 

我不知道Haskell中的任何单一定义必须写在多行上。 以上确实在GHCi中有效:

 > :t abs' abs' :: (Num a, Ord a) => a -> a 

对于其他expression式,例如块,您需要使用非布局语法和大括号和分号(eugh)。