2013-10-02 119 views
0

我试图在Haskell的警卫内部使用警卫时遇到了问题,我试着发现是否可以甚至这样做,但我找不到任何答案在互联网上,我希望你们知道答案。这是在试图编译我的代码,我发现了错误: Assignment2.hs:134:75: parse error on input '|'我可以在Haskell的警卫内部使用警卫吗

我的代码:

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 [email protected]((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 

的代码是井字棋的比赛中,这部分代码是应该找出哪个球员赢了;类型Board是自定义的,输入示例:hasWinner((X,O,X),(X,O,O),(X,X,O))(输出应该是:只是P1)。

感谢您的帮助!

+0

您是否检查过所有的空格是空格而不是制表符?此外,该函数的赢家是' - >'而不是'=' – DiegoNolan

+0

我想知道你为什么期望这样编译,以及它应该如何工作。显然你想以某种方式评估'showTime'的'Maybe'结果? – leftaroundabout

回答

6

程序中至少有2个严重的语法错误和一个类型错误。

语法错误:

| showTime b  -> spot of error 
    | showTime (verticals b) 

这里的右手边丢失。一般形式是

| guard = expression 

如果没有表达式,就不能离开。编译器等待'=',但找到'|'的下一个后卫,所以它知道它的错误。

类型的错误是在这里:

| g==h && g==i = Just (symbolToPlayer i) 
    | otherwise = False 

你必须决定该功能是否应该返回BoolMaybe Player

1

这个怎么样?

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和Applicative是你的朋友!