Haskell中的替换算法

NuN*_*uNu 4 haskell substitution

我正在尝试在Haskell中编写替换算法.我已经Subst a使用单个构造函数定义了一个多态数据类型,S::[(String, a)] -> Subst a如下所示:

data Subst a = S [(String, a)]
Run Code Online (Sandbox Code Playgroud)

我现在想编写一个函数single::String -> a -> Subst a来构造仅一个变量的替换

这是我试过的:

single::String -> a -> Subst a
single s1 (Subst a) = s1 a
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误: Not in scope: data constructor 'Subst'

有谁有洞察我做错了什么?

Wes*_*Wes 8

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

在你的代码的类型构造Subst数据的构造S

类型构造函数用于创建新的类型,例如在data Foo = Foo (Maybe Int) Maybe一个类型的构造,Foo是数据的构造函数(以及类型构造,但它们可以被不同地命名为你发现的).数据构造函数用于创建类型的实例(也不要将其与创建多态类型的实例混淆,例如Int -> Int是实例a -> a).

因此,您需要Ssingle函数中使用模式匹配时使用.没有Subst.

希望这是有道理的,如果没有,请告诉我:)

对于所有意图和目的,PS数据构造函数都是函数,这意味着您可以使用它们执行与函数通常相同的操作.例如,你可以这样做map Bar [a,b,c],它将数据构造函数应用于每个元素.