2012-11-05 27 views
4

我想在Haskell中编写替换算法。 我已经定义了一个多态数据类型Subst a有一个构造函数S::[(String, a)] -> Subst a像这样:Haskell中的替换算法

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'

有没有人有见识我做错了什么?

+0

n.b.如果您创建的数据类型只包含“一个”值并且只有一个构造函数,则可以使用'newtype'来提高效率。 'newtype Subst a = Subst [(String,a)]'。通常,对于新类型,通常将构造函数命名为与类型名称相同。 –

回答

8

的数据构造是不一样的东西作为型constuctor

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

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

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

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

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

+0

感谢您解释差异 – NuNu

3
single :: String -> a -> Subst a 
single str a = S [(str, a)] 

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

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

+0

感谢您解释 – NuNu