Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Lambda帮助-创建应用程序函数_Haskell_Lambda_Functional Programming_Lambda Calculus - Fatal编程技术网

Haskell Lambda帮助-创建应用程序函数

Haskell Lambda帮助-创建应用程序函数,haskell,lambda,functional-programming,lambda-calculus,Haskell,Lambda,Functional Programming,Lambda Calculus,我试图创建一个函数应用程序,当给定一个术语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: La

我试图创建一个函数应用程序,当给定一个术语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 :: Term -> [Term] -> Term
applications v [] = v
applications v (x:xs)
    |x == [] = Lambda x v
    |otherwise = Lambda x (applications v xs)     

我将感谢任何帮助,因为我是新手

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

type Var  = String
data Term = Var Var | Lambda Var Term | App Term Term deriving Show
也就是说,该应用程序由二进制数据构造函数
App
捕获

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

其中,lambda抽象通常尽可能向右延伸,即lambda x1。λx2。t=λx1。(lambda x2.t),函数应用程序通常与左侧关联,即,tu1 u2=(tu1)u2。因此,函数
应用程序
的简单应用可能是:

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")
现在,最后,
抽象
应用程序
遵循熟悉的模式<代码>摘要
可以写为要抽象的变量列表的右折,而
应用程序
可以写为要应用的术语列表的左折:

abstractions = foldr Lambda
applications = foldl App

在你的
应用程序中
你传递了一个
术语的列表
s,你的
Lambda
很可能期望一个
Var
作为头部的项目?此外,我想它应该是
null xs
而不是
x=[]
,尽管这可能不是“核心问题”。
应用程序
也与
抽象
相反。在这里,您应该基本上对
Lambda
进行模式匹配,然后将Lambda主体中Lambda头部的变量替换为有帮助的术语。@WillemVanOnsem。我的代码现在显示为:| null xs=Lambda x v,尽管我现在在这行上得到一个错误:|否则=Lambda x(应用程序v xs)是的,因为如上所述,您不能在
Lambda
中使用
项作为变量。此外,
应用程序
应该与
抽象
相反。您不希望使用
Lambda
来构建应用程序。在您想要执行的操作的描述中没有lambda:“给定一个术语N和一组术语(X1,…,Xn)返回N(X1,…,Xn)”。通常应用程序有一个
术语
构造函数。这是一个极好的帮助。现在更了解它的窍门。谢谢
abstractions = foldr Lambda
applications = foldl App