【问题标题】:Haskell Lambda help - Creating a applications functionHaskell Lambda 帮助 - 创建应用程序函数
【发布时间】:2020-05-02 10:37:53
【问题描述】:

我正在尝试创建一个函数 applications,当给定一个术语 N 和一个术语列表 (X1,...,Xn) 时,它将返回 N(X1,...,Xn )

但是当我运行我的代码时,它显示以下错误:

    * Couldn't match type `Term' with `[Char]'
      Expected type: Var
        Actual type: Term
    * In the first argument of `Lambda', namely `x'
      In the expression: Lambda x (applications v xs)
      In an equation for `applications':
          applications v (x : xs)
            | x == [] = Lambda x v
            | otherwise = Lambda x (applications v xs)
    |
147 |     |otherwise = Lambda x (applications v xs)

但由于某种原因,我的 applications 函数会导致此错误,即使它看起来类似于我的工作 abstractions

applications :: Term -> [Term] -> Term
applications v [] = v
applications v (x:xs)
    |x == [] = Lambda x v
    |otherwise = Lambda x (applications v xs)     

如果我是新手,我将不胜感激!

【问题讨论】:

  • 那么在您的applications 中,您传递了Terms 的列表,您的Lambda 可能期望Var 作为头中的项目?此外,我猜应该是null xs 而不是x == [],尽管这可能不是“核心问题”。
  • applications 也是 abstractions 的反义词,根据这里的描述。这里你应该基本上在Lambda上进行模式匹配,然后将lambda主体中的lambda头部的变量替换为term。
  • @WillemVanOnsem 有帮助。我的代码现在显示为:|null xs = Lambda x v 虽然我现在在线上遇到错误:|otherwise = Lambda x (applications v xs)
  • 是的,因为如上所述,您不能在您的Lambda 中使用Term 作为变量。此外,applications 应该与abstractions相反
  • 您不想使用Lambda 来构建应用程序。您对要执行的操作的描述中没有 lambda:“给定一个术语 N 和一个术语列表 (X1,...,Xn) 返回 N(X1,...,Xn)”。通常有一个Term 应用程序的构造函数。

标签: haskell lambda functional-programming lambda-calculus


【解决方案1】:

我假设您的类型 Term 定义如下:

type Var  = String
data Term = Var Var | Lambda Var Term | App Term Term deriving Show

也就是说,该应用程序被二进制数据构造函数App捕获。

现在,请注意,您对abstractions 的定义可以通过删除第二个子句的大小写区别来简化(空尾的大小写已经被第一个子句捕获):

abstractions :: Term -> [Var] -> Term
abstractions t []       = t
abstractions t (x : xs) = Lambda x (abstractions t xs)

其中 lambda 抽象通常尽可能向右延伸,即 lambda x1。 λx2。 t = λ x1。 (lambda x2.t),函数应用通常关联到左边,即t u1 u2 = (t u1) u2。因此,您的函数applications 的直接应用可能是:

applications :: Term -> [Term] -> Term
applications t []       = t
applications t (u : us) = applications (App t u) us

例如:

> applications (Var "x") [Var "y", Var "z"]
App (App (Var "x") (Var "y")) (Var "z")

现在,终于,abstractionsapplications 遵循熟悉的模式。 abstractions 可以写成要抽象的变量列表的右折叠,applications 可以写成要应用的术语列表的左折叠:

abstractions = foldr Lambda
applications = foldl App

【讨论】:

  • 这是一个绝妙的帮助。现在更多地掌握它。谢谢。
猜你喜欢
  • 2023-03-26
  • 2019-05-12
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多