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)],但 的第二个参数get必须是 a 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 回答