Haskell中的替换算法

时间:2012-11-05 17:48:11

标签: haskell substitution

我正在尝试在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'

有没有人能够洞察我做错了什么?

2 个答案:

答案 0 :(得分:8)

数据构造函数与类型构造函数

不同

在您的代码中,类型构造函数Subst 数据构造函数S

类型构造函数用于创建新类型,例如在data Foo = Foo (Maybe Int) Maybe中是类型构造函数,Foo是数据构造函数(以及类型构造函数,但它们的名称可能与您发现的不同) 。 Data 构造函数用于创建类型的实例(也不要将此与创建多态类型的实例混淆,例如Int -> Inta -> 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的单个替换规则。