-1

我尝试使用受保护的方程来定义一个函数。为什么它在 GHCi 中不起作用?谢谢。

Prelude> :{
Prelude| maxThree :: Integer -> Integer -> Integer -> Integer
Prelude| maxThree x y z
Prelude| x >= y && x >= z = x
Prelude| y >= z = y
Prelude| otherwise = z
Prelude| :}

<interactive>:77:1: error: Parse error in pattern: x >= y
4

1 回答 1

8

你的语法是错误的。不要被提示已经包含的事实所迷惑|!你写的内容如下:

maxThree :: Integer -> Integer -> Integer -> Integer
maxThree x y z
x >= y && x >= z = x
y >= z = y
otherwise = z

如您所见,这显然是错误的。守卫总是以竖线开头|,但你把它省略了。Prelude|我假设您对提示已经包含的事实感到困惑|;那是 GHCi 的 UI 的一部分,被认为是你输入的代码的一部分。如果你想在 GHCi 中输入一个守卫,这样做:

Prelude> :{
Prelude| maxThree :: Integer -> Integer -> Integer -> Integer
Prelude| maxThree x y z
Prelude|   | x >= y && x >= z = x
Prelude|   | y >= z = y
Prelude|   | otherwise = z
Prelude| :}

请注意,我将代码输入 GHCi的方式与将其输入文件的方式完全相同,包括守卫需要相对于定义的开头缩进这一事实。

于 2019-07-27T22:54:39.180 回答