10

在学校练习

我有这个功能

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

我被要求修改 bar 以使用 '|' 所以我想做类似的事情:

let bar x y = | x 0 = 0 | 0 y = 0 | x y = x * y

但是在ghci中我得到了

parse error on input '='

我怎样才能在 GHCi 中做到这一点?使用模式匹配 ('|') 的事实会改变什么吗?

4

3 回答 3

19

查看使用守卫的语法:

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
于 2013-03-31T19:41:08.873 回答
14

使用文件

不要将代码直接输入到 ghci 中,除非它真的是单行代码。

将您的代码保存在名为 PatternMatch.hs 的文本文件中,然后通过键入将其加载到 ghci 中。

:l PatternMatch.hs

然后如果您进行更改(并保存),您可以通过键入重新加载 ghci 中的文件

:r

或者,您可以在它们所在的练习之后命名您的文件,或者如果它确实是一次性代码,则只需一个可重用的 Temp.hs。

通过将内容保存在文本文件中,您可以更轻松地对其进行编辑和重用。

模块

稍后您将使用适当的模块将相关功能收集在一起,以便将它们导入其他程序。例如,你可以有

module UsefulStuff where

pamf = flip fmap

保存在一个名为 UsefulStuff.hs 的文件中,然后保存在另一个文件中,您可以

import UsefulStuff

然后使用 UsefulStuff 那里的功能。

模块对于你现在正在做的事情来说太过分了,但是获得编辑、保存、重新编译、测试、重复的工作流程,你会省去很多努力。

于 2013-03-31T22:49:25.700 回答
0

:set +mGHCi 允许通过输入解释器进行多行输入。有关详细信息,请参阅多行输入部分

这是一个演示它的示例:

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>
于 2021-02-24T03:10:48.030 回答