【发布时间】:2020-06-03 12:09:37
【问题描述】:
在 this book 之后,Haskell 中的所有内容都是 λ-calculus:像 f(x)=x+1 这样的函数可以在 Haskell 中编写为 f = \x -> x+1 和 λ 表达式中的 λx.x+1。
- 对于像
map::(a -> b) -> [a] -> [b]这样的高阶函数,λ表达式是什么?或λ函数($) :: (a -> b) -> a -> b的表达式? - 函数列表(即
f::[a->b])呢?一个具体的例子可以是h = map (\f x -> f x 5) [(-),(+)]。那么λ表示法类似于h = map (λfx.f(x(5)) [(λab.a-b),(λab.a+b)]?
我只熟悉 alpha 转换、beta 缩减等过程,但如果您以 λ 术语分解函数列表,将不胜感激,无需简化。
谢谢。
【问题讨论】:
-
您如何在 lambda 演算中表示列表?
-
$ = \f -> \x -> f x变为λf.λx.f(x)。它实际上只是同一事物的不同语法。 -
如果我错了请纠正我但是当你写
λf.λx.f(x)时,它意味着一个返回f(x)的函数?而($) :: (a -> b) -> a -> b接受一个函数λx. termsOf(x)并返回另一个函数或λx. termsOf(x)? -
抽象数据类型只预定义了类型构造函数和析构函数。特别是
::和[]是两个常量cons :: α → [α] → [α]和nil :: [α]的语法糖。列表[1,2,3]只是一个术语1::2::3::[]或更少的语法糖cons(1, cons(2, cons(3, nil)))。 -
在无类型的 lambda 演算中,高阶函数只是一个函数,因为你不能说任何特定变量代表什么;一切都是根据抽象的应用程序如何相互关联来编码的。类型化的 lambda 演算是另一回事。
标签: haskell functional-programming higher-order-functions lambda-calculus