GHCi中的模式匹配

时间:2013-03-31 18:59:24

标签: haskell

在学校练习

我有这个功能

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中做到这一点? 使用模式匹配('|')的事实会改变什么吗?

3 个答案:

答案 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>