我正在尝试用 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 -> Int
是 a -> a
的实例)。
因此,当您想在 S
函数中进行模式匹配时,您需要使用 single
。不是 Subst
。
希望这是有道理的,如果没有,请告诉我:)
附言就所有意图和目的而言,数据构造函数都是函数,这意味着您可以使用它们执行通常使用函数执行的操作。例如。您可以执行 map Bar [a,b,c]
并将数据构造函数应用于每个元素。
关于haskell - Haskell 中的替换算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13237527/