我正在尝试用 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'
有没有人知道我做错了什么?

最佳答案

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

在您的代码中,类型构造函数是 Subst 数据构造函数是 S
类型构造函数用于创建新类型,例如在 data Foo = Foo (Maybe Int)Maybe 是一个类型构造函数,Foo 是数据构造函数(以及类型构造函数,但它们可以根据您的发现命名不同)。数据构造函数用于创建类型的实例(也不要将此与创建多态类型的实例混淆,例如 Int -> Inta -> a 的实例)。

因此,当您想在 S 函数中进行模式匹配时,您需要使用 single。不是 Subst

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

附言就所有意图和目的而言,数据构造函数都是函数,这意味着您可以使用它们执行通常使用函数执行的操作。例如。您可以执行 map Bar [a,b,c] 并将数据构造函数应用于每个元素。

关于haskell - Haskell 中的替换算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13237527/

10-13 01:15