为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星coding 2019-10-24 14:07:49
我正在尝试定义任何简单的函数来跨越ghci中的多行,请以以下示例为例:let abs n | n >= 0 = n          | otherwise = -n到目前为止,我已经尝试在第一行之后按Enter键:Prelude> let abs n | n >= 0 = nPrelude>           | otherwise = -n<interactive>:1:0: parse error on input `|'我也尝试过使用:{and :}命令,但距离并不远:Prelude> :{unknown command ':{'use :? for help.我在Linux上使用适用于Haskell 98的GHC Interactive 6.6版,我缺少什么?
查看完整描述

3 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

对于后卫(如您的示例),您可以将它们全部放在一行上,这样就可以工作(后卫不在乎间距)


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) }


查看完整回答
反对 回复 2019-10-24
?
DIEA

TA贡献1820条经验 获得超2个赞

GHCi现在具有多行输入模式,已通过:set + m启用。例如,


Prelude> :set +m

Prelude> let fac 0 = 1

Prelude|     fac n = n * fac (n-1)

Prelude|

Prelude> fac 10

3628800


查看完整回答
反对 回复 2019-10-24
?
精慕HU

TA贡献1845条经验 获得超8个赞

丹是正确的,但:{并:}必须在每个出现在自己的行:


> :{ 

> let foo a b = a +

>           b

> :}

> :t foo

foo :: (Num a) => a -> a -> a

这也与布局规则交互,因此在使用do表示法时,显式使用花括号和分号可能会更容易。例如,此定义失败:


> :{

| 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 ()

仅当从文件中粘贴定义(缩进可能会更改)时,这才真正重要。


查看完整回答
反对 回复 2019-10-24
  • 3 回答
  • 0 关注
  • 556 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信