1

Haskell では、次のようSubst aに単一のコンストラクターで多相データ型を定義しS :: [(String, a)] -> Subst aました。

data Subst a where
    S :: [(String, a)] -> Subst a
    deriving (Show)

get::String -> Subst a -> Maybe a変数名と置換を取り、その変数を置換する必要がある値を返す関数を定義したいと考えています。変数で置換が定義されていない場合、関数は Nothing を返す必要があります。

私は次のことを試しました:

get :: String -> Subst a -> Maybe a
get str (S[]) = Nothing
get str (S((a,b):xs)) = if str == a then Just b
    else get str xs

しかし、私はエラーが発生しています。理由はありますか?

4

1 に答える 1

4
get str (S((a,b):xs)) = if str == a then Just b
    else get str xs

xsは type のリストです[(String, a)]が、 の 2 番目の引数は でgetなければなりませんSubst a。コンストラクターを使用して正しい型の値を構築すると機能します。

get str (S((a,b):xs)) = if str == a then Just b
    else get str (S xs)

リストを直接使用して変数を検索する方が簡単です。

Prelude> :t lookup
lookup :: Eq a => a -> [(a, b)] -> Maybe b

それで

get str (S xs) = lookup str xs

あなたが望むことを正確に行います。

于 2012-11-07T03:01:15.537 に答える