4

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

有没有人知道我做错了什么?

4

2 回答 2

8

数据构造函数和类型构造函数不是一回事

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

类型构造函数用于创建新类型,例如 indata Foo = Foo (Maybe Int) Maybe类型构造函数,Foo是数据构造函数(以及类型构造函数,但您发现它们的名称可能不同)。数据构造函数用于创建类型的实例(也不要将此与创建多态类型的实例混淆,例如Int -> Int是 的实例a -> a)。

所以S当你想在你的single函数中进行模式匹配时,你需要使用它。不是Subst

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

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

于 2012-11-05T17:52:25.603 回答
3
single :: String -> a -> Subst a
single str a = S [(str, a)]

[(str, a)]部件创建一个包含一个元素的列表。该元素是一个元组(或“对”),str作为元组的左侧部分和元组a的右侧部分。然后,上面的函数将该单元素列表包装在S构造函数中,以创建 a 类型Subst的值。

str结果是一个列表,其中包含从到 value的单个替换规则a

于 2012-11-05T18:42:24.387 回答