我可以在Haskell的守卫中使用守卫吗
我在Haskell尝试使用警卫中的警卫时遇到了一个问题,我试图找出是否不可能这样做,但我在互联网上找不到任何答案,我希望你们知道答案。这是我在尝试编译代码时遇到的错误: Assignment2.hs:134:75:对输入“|”的分析错误 我的代码:我可以在Haskell的守卫中使用守卫吗,haskell,guard,Haskell,Guard,我在Haskell尝试使用警卫中的警卫时遇到了一个问题,我试图找出是否不可能这样做,但我在互联网上找不到任何答案,我希望你们知道答案。这是我在尝试编译代码时遇到的错误: Assignment2.hs:134:75:对输入“|”的分析错误 我的代码: verticals :: Board -> (Row, Row, Row) verticals ((a,b,c),(d,e,f),(g,h,i)) = ((a,d,g),(b,e,h),(c,f,i)) symb
verticals :: Board -> (Row, Row, Row)
verticals ((a,b,c),(d,e,f),(g,h,i)) = ((a,d,g),(b,e,h),(c,f,i))
symbolToPlayer :: Field -> Player
symbolToPlayer X = P1
symbolToPlayer O = P2
showTime :: Board -> Maybe Player
showTime ((a,b,c),(d,e,f),(g,h,i))
| a==b && a==c = Just (symbolToPlayer a)
| d==e && d==f = Just (symbolToPlayer d)
| g==h && g==i = Just (symbolToPlayer i)
| otherwise = False
hasWinner :: Board -> Maybe Player
hasWinner b@((a,b,c),(d,e,f),(g,h,i))
| showTime b -> spot of error
| showTime (verticals b)
| a==e && a==i = Just (symbolToPlayer a)
| c==e && c==g = Just (symbolToPlayer c)
| otherwise = Nothing
这段代码是为一个“井字游戏”编写的,这段代码的目的是找出哪个玩家赢了;类型板是自定义的,输入示例:X,O,X,X,O,O,X,X,O输出应为:仅P1
谢谢你的帮助 程序中至少有两个严重语法错误和一个类型错误 语法错误:
| showTime b -> spot of error
| showTime (verticals b)
这里右手边不见了。一般形式是
| guard = expression
没有表情你是逃不掉的。编译器等待一个“=”,但找到下一个保护的“|”,因此它知道它的错误
类型错误如下所示:
| g==h && g==i = Just (symbolToPlayer i)
| otherwise = False
您必须决定函数是否应该返回Bool或者Player。这个如何
import Control.Monad (msum)
import Control.Applicative ((<*>), pure)
data Player = P1 | P2 | None deriving (Eq, Show)
data Field = X | O | B deriving (Eq, Show)
type Board = ((Field, Field, Field)
,(Field, Field, Field)
,(Field, Field, Field))
symbolToPlayer :: Field -> Player
symbolToPlayer X = P1
symbolToPlayer O = P2
symbolToPlayer B = None
checkThree :: (Field,Field,Field) -> Maybe Player
checkThree (a,b,c)
| a == b && a == c = Just $ symbolToPlayer a
| otherwise = Nothing
winHorizontal :: Board -> Maybe Player
winHorizontal (r1, r2, r3) = msum $ map checkThree [r1, r2, r3]
winVertical :: Board -> Maybe Player
winVertical ((a,b,c), (d,e,f), (g,h,i)) =
msum $ map checkThree [(a,d,g), (b,e,h), (c,f,i)]
winDiagonal :: Board -> Maybe Player
winDiagonal ((a,_,c), (_,e,_), (g,_,i)) =
msum $ map checkThree [(a,e,i), (c,e,g)]
hasWinner :: Board -> Maybe Player
hasWinner b = msum $ [winHorizontal, winVertical, winHorizontal] <*> pure b
Monad和Applicationive是你的朋友 你检查过你所有的空格都是空格而不是制表符吗?此外,该函数还有winner was->而不是=我想知道为什么您希望编译它,以及它应该如何工作。显然你想以某种方式评估showTime的结果?