【问题标题】:Substitution Algorithm in HaskellHaskell中的替换算法
【发布时间】:2012-11-06 05:28:04
【问题描述】:

我正在尝试在 Haskell 中编写替换算法。 我已经用单个构造函数S::[(String, a)] -> Subst 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'

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

【问题讨论】:

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

标签: haskell substitution


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:
    single :: String -> a -> Subst a
    single str a = S [(str, a)]
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多