【发布时间】:2012-11-07 02:45:24
【问题描述】:
在 Haskell 中,我使用单个构造函数 S :: [(String, a)] -> Subst 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
但我遇到了错误。任何想法为什么?
【问题讨论】:
-
您有任何理由使用 GADT 语法吗?你不能把你的类型写成
data Subst a = S [(String, a)] deriving Show吗? -
@Tikhon 实际上没有什么特别的原因,我正在尝试两种方式作为一种学习机制,看看它是否不同
-
我建议使用
Map String a而不是[(String,a)]。查找列表需要 O(n) 而查找 maps 需要 O(log n)。 -
+1 @PetrPudlák 建议。即使您不关心性能,
Map a b类型也有非常丰富的用于查找和插入的 API。
标签: haskell substitution unification