我正在尝试在Haskell中编写替换算法。
我已经使用单个构造函数Subst a
定义了多态数据类型S::[(String, a)] -> Subst a
,如下所示:
data Subst a = S [(String, a)]
我现在想编写一个函数single::String -> a -> Subst a
,用于构造仅一个变量的替换
这就是我的尝试:
single::String -> a -> Subst a
single s1 (Subst a) = s1 a
但是,我收到此错误:Not in scope: data constructor 'Subst'
有没有人能够洞察我做错了什么?
答案 0 :(得分:8)
数据构造函数与类型构造函数
不同在您的代码中,类型构造函数为Subst
数据构造函数为S
类型构造函数用于创建新类型,例如在data Foo = Foo (Maybe Int)
Maybe
中是类型构造函数,Foo
是数据构造函数(以及类型构造函数,但它们的名称可能与您发现的不同) 。 Data 构造函数用于创建类型的实例(也不要将此与创建多态类型的实例混淆,例如Int -> Int
是a -> a
的实例。 / p>
因此,当您想在S
函数中进行模式匹配时,需要使用single
。不是Subst
。
希望这是有道理的,如果没有,请告诉我:)
P.S。对于所有意图和目的而言,数据构造函数都是函数,这意味着您可以使用函数执行相同的操作。例如。你可以做map Bar [a,b,c]
,它会将数据构造函数应用于每个元素。
答案 1 :(得分:3)
single :: String -> a -> Subst a
single str a = S [(str, a)]
[(str, a)]
部分创建一个包含一个元素的列表。该元素是一个元组(或“对”),其中str
作为元组的左侧部分,a
作为元组的右侧部分。然后,上面的函数将S
构造函数中的单元素列表包装起来,以创建类型Subst
a的值。
结果是一个列表,其中包含从str
到值a
的单个替换规则。