在学校练习
我有这个功能
bar :: Float -> Float -> Float
bar x 0 = 0
bar 0 y = 0
bar x y = x * y
我在GHC中输入
let bar x 0 = 0; bar 0 y = 0; bar x y = x * y
并评估
bar foo 0
bar 0 foo
我被要求修改条形以使用'|'所以我想做点什么:
let bar x y = | x 0 = 0 | 0 y = 0 | x y = x * y
但是在ghci我得到了
parse error on input '='
我怎样才能在GHCi中做到这一点? 使用模式匹配('|')的事实会改变什么吗?
答案 0 :(得分:17)
查看使用警卫的语法:
bar x y | x == 0 = 0
| y == 0 = 0
| otherwise = x * y
写在GHCi的一行:
let bar x y | x == 0 = 0 | y == 0 = 0 | otherwise = x * y
答案 1 :(得分:9)
使用文件
不要将代码直接输入ghci,除非它真的是一行代码。
将代码保存在名为PatternMatch.hs的文本文件中,并通过键入将其加载到ghci中。
:l PatternMatch.hs
然后如果你进行了更改(并保存),你可以通过输入
重新加载ghci中的文件:r
或者,你可以在他们所在的练习之后命名你的文件,或者如果真的是一次性代码,你可以重新安装Temp.hs。
通过在文本文件中保存内容,您可以更轻松地编辑和重用它。
<强>模块强>
稍后您将使用适当的模块一起收集相关功能,因此他们可以导入其他程序。例如,你可以有
module UsefulStuff where
pamf = flip fmap
保存在名为UsefulStuff.hs的文件中,然后保存在另一个文件中
import UsefulStuff
然后使用UsefulStuff中的函数。
模块对于您现在正在做的事情来说是过度的,但是获得编辑,保存,重新编译,测试,重复的工作流程,您将从相当多的努力中省去。
答案 2 :(得分:0)
GHCi 允许通过在解释器中输入 :set +m
来进行多行输入。有关详情,请参阅 Multiline input section。
这是一个演示它的示例:
GHCi, version 8.8.3: https://www.haskell.org/ghc/ :? for help
Prelude> :set +m
Prelude> { incList [] = []
Prelude| ; incList (x:xs) = x+1:incList xs
Prelude| }
Prelude> incList [40, 41, 42]
[41,42,43]
Prelude>