我对 Haskell 比较陌生。这是我想做的:
我想将字符串解析为棋子。我的代码非常简单,所以我希望它会自我解释:
data ChessPiece = King | ... etc
data DraughtPiece = DKing | ... etc
data Player = Black | White deriving (Show, Eq)
data Piece a = Piece (a, Player)
所以一个棋子可以是任何 2 场比赛,或者 2 名玩家。我想要一个字符串“k”或“K”分别解析为一个黑色或白色的国王,所以我做了这个:
class Parse a where
parse :: String -> a
instance Parse ChessPiece where
parse a = case a of
"k" -> King
到目前为止一切都很好..我可以打电话> parse "k" :: ChessPiece
。这行得通!
instance Parse a => Parse (Piece a) where
parse x | isLowercase x = Piece (parse x, White)
| otherwise = Piece (parse $ lowercase x, Black)
这必须适用于任何一块。大写和小写规则适用于 DraughtPiece 和 ChessPiece。我如何告诉 Haskell 将 x 解析为正确的类型 (a)。省略演员表parse x
会给我带来非详尽的模式错误,将其更改为parse x :: a
让我“无法从上下文中使用“解析”(解析 a)中推断出(解析 a1)”
我如何告诉 Haskell to parse "K" :: Piece ChessPiece
to (parse "k" :: ChessPiece, Black)
to (King, Black)
?