私は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) に解析するように指示するにはどうすればよいですか。for のキャストを省略すると、parse x
非網羅的なパターン エラーが発生します。これを変更すると、parse x :: a
「コンテキスト (Parse a) からの 'parse' の使用から (Parse a1) を推測できませんでした」
parse "K" :: Piece ChessPiece
Haskell に to to to(parse "k" :: ChessPiece, Black)
を伝えるにはどうすればよい(King, Black)
ですか?