次のようなデータ型が与えられます
data Value = IntVal Integer |
BoolVal Bool
deriving Show
getVal
値を受け取り、内部に実際の値を返す関数を作成しようとしています。パターンマッチングで達成しようとしていました
getVal (IntVal val) = val
getVal (Bool bool) = bool
しかし、Haskellは返される型について文句を言います期待される型「整数」を実際の型「ブール」と一致させることができませんでした
だから私はそれに署名を与えました型変数を返します
getVar :: Value -> a
しかし、それも機能しません
これを行う1つの方法は、型クラスを使用して、戻り値で関数を多形にすることです。
\> :t getVal
getVal :: GetValue a => Value -> Maybe a
以下のような簡単なコードで:
data Value = IntVal Integer
| BoolVal Bool
deriving Show
class GetValue a where
getVal :: Value -> Maybe a
instance GetValue Integer where
getVal (IntVal i) = Just i
getVal _ = Nothing
instance GetValue Bool where
getVal (BoolVal b) = Just b
getVal _ = Nothing
そして型推論に正しい関数を決定させます:
\> import Data.Maybe (fromJust)
\> (3 +) .fromJust . getVal $ IntVal 5 -- getVal :: Value -> Maybe Integer
8
\> not . fromJust . getVal $ BoolVal False -- getVal :: Value -> Maybe Bool
True
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加