Haskell lambda抽象的实践部分
我是Haskell编程新手。现在我学习lambda函数和lambda抽象。我想,lambda函数的练习部分是什么。例如,我们有:Haskell lambda抽象的实践部分,haskell,abstraction,lambda,Haskell,Abstraction,Lambda,我是Haskell编程新手。现在我学习lambda函数和lambda抽象。我想,lambda函数的练习部分是什么。例如,我们有: map(\x -> x * 2) [1,2,3,4,5] [2,4,6,8,10] 这个练习部分的内容是什么?我们可以创建普通函数并在map函数参数中设置它。仅用于代码缩减?那为什么要提出这个抽象概念呢。代码缩减并不是什么大问题。为什么? 谢谢。并不是所有函数都被广泛使用,都值得一个名字。例如,如果您只使用此函数一次,那么对于此特定映射,您可能不想为其指定名称
map(\x -> x * 2) [1,2,3,4,5]
[2,4,6,8,10]
这个练习部分的内容是什么?我们可以创建普通函数并在map函数参数中设置它。仅用于代码缩减?那为什么要提出这个抽象概念呢。代码缩减并不是什么大问题。为什么?
谢谢。并不是所有函数都被广泛使用,都值得一个名字。例如,如果您只使用此函数一次,那么对于此特定映射,您可能不想为其指定名称,因为您将永远不会再使用它。并非所有函数的使用范围都足够广泛,都值得命名。例如,如果您只使用此函数一次,对于此特定映射,您可能不想为其指定名称,因为您将永远不会再使用它。您经常会遇到这样的情况,即您需要一个非常专用的函数。它在软件的这一部分中使用,并且仅在那里使用。因此,给它一个具体的名字没有任何意义 您经常面临这样的情况,即您需要一个非常专门的函数。它在软件的这一部分中使用,并且仅在那里使用。因此,给它一个具体的名字没有任何意义 可读性;你可以说得牵强,但要说明这一点
map (\x -> x * 2) . anotherfunction . anotheragain . itgoesonandon $
[ a lont list ]
vs
这是品味的问题,但在第一种情况下,你马上知道你映射的是什么函数,在第二种情况下,你必须在源代码中找到f,它可能在几行之外
顺便说一下,我会写地图*2。。。。反正
另一个例子是去糖一元表示法
比如说,
do a <- action1
b <- action2
action3
c <- action4 a b
action5 c
vs
这段代码可能有错误,但无论如何我都不会写这段代码的可读性;你可以说得牵强,但要说明这一点
map (\x -> x * 2) . anotherfunction . anotheragain . itgoesonandon $
[ a lont list ]
vs
这是品味的问题,但在第一种情况下,你马上知道你映射的是什么函数,在第二种情况下,你必须在源代码中找到f,它可能在几行之外
顺便说一下,我会写地图*2。。。。反正
另一个例子是去糖一元表示法
比如说,
do a <- action1
b <- action2
action3
c <- action4 a b
action5 c
vs
代码中可能有错误,但无论如何我都不会这样写如果我正确理解了你的问题,你会问为什么有人会在特定编程语言范围之外提出Lambda函数的抽象,对吗 编程语言中的Lambda函数是从中派生出来的,这是一个函数定义的形式化系统。正如维基百科所说,Lambda微积分是由Alonzo Church在20世纪30年代引入的,作为对数学基础调查的一部分。它有着广泛的应用,不仅仅是在计算机科学领域
正如上面一位评论者所指出的,它的根源是Lambda演算。我只能建议你阅读维基百科的相关条目,里面有一些非常有趣的信息;- 如果我正确理解您的问题,您会问为什么有人会在特定编程语言范围之外提出Lambda函数的抽象,对吗 编程语言中的Lambda函数是从中派生出来的,这是一个函数定义的形式化系统。正如维基百科所说,Lambda微积分是由Alonzo Church在20世纪30年代引入的,作为对数学基础调查的一部分。它有着广泛的应用,不仅仅是在计算机科学领域
正如上面一位评论者所指出的,它的根源是Lambda演算。我只能建议你阅读维基百科的相关条目,里面有一些非常有趣的信息;- 有两种方法来解释这个问题。第一个问题是,当我们可以写时,为什么要写map\x->x*x
doubleIt x = x * x
... map doubleIt ...
答案是你可能有以下几点:
foo y zs = map (\x -> x^y) zs
然后,没有完全直接的转换允许您将匿名函数完全浮动到顶层
我们可以写
foo y zs = map (powerIt y) xs
powerIt y = ?
然后我们发现powerIt y=\x->x^y!当然,您可以将x浮回外部定义,但在这种情况下,您实际上希望这样做,尽管从语法上说Haskell并不要求您将powerIt y写成\x->powerIt y x
当您拥有第一类函数时,它们需要关闭它们的环境,这意味着您需要某种方法来引入一个函数,该函数可以引用声明它的词法范围中的内容。这就是兰博达斯的力量
现在,另一个问题是,为什么不将匿名函数浮动到适当的级别,而不是顶部,从而获得,例如
foo y zs = let powerIt x = x^z
in map powerIt zs
在这种情况下,再仔细考虑一下let的真正含义。事实上,我们可以通过以下方式将let转换为几个lambda:foo ys zs=\powerIt->map powerIt zs\x->x^y
现在,在实际的实现中,这些去语法化并不是完全以这种方式发生的,有时会出现不同的子句
由于涉及效率的原因,编译器会对其进行不同的处理。但核心问题仍然存在——lambdas功能强大且价格昂贵,可以为我们提供一种简单易懂的核心语言,尽管我们在其上叠加了多种绑定形式
没有lambdas,我们就有了一种语言,在这种语言中我们可以定义变量,定义函数,然后有时我们可以用函数做某些事情。有了lambdas,我们就有了一种语言,在这种语言中,函数和其他任何值一样都是值,我们有一套统一的方法为任何东西指定名称
相反的观点是,lambdas不是一个特例,而是一个普通案例,而我们所有其他各种名称绑定机制都是它们的糖。有两种方法来解释这个问题。第一个问题是,当我们可以写时,为什么要写map\x->x*x
doubleIt x = x * x
... map doubleIt ...
答案是你可能有以下几点:
foo y zs = map (\x -> x^y) zs
然后,没有完全直接的转换允许您将匿名函数完全浮动到顶层
我们可以写
foo y zs = map (powerIt y) xs
powerIt y = ?
然后我们发现powerIt y=\x->x^y!当然,您可以将x浮回外部定义,但在这种情况下,您实际上希望这样做,尽管从语法上说Haskell并不要求您将powerIt y写成\x->powerIt y x
当您拥有第一类函数时,它们需要关闭它们的环境,这意味着您需要某种方法来引入一个函数,该函数可以引用声明它的词法范围中的内容。这就是兰博达斯的力量
现在,另一个问题是,为什么不将匿名函数浮动到适当的级别,而不是顶部,从而获得,例如
foo y zs = let powerIt x = x^z
in map powerIt zs
在这种情况下,再仔细考虑一下let的真正含义。事实上,我们可以通过以下方式将let转换为几个lambda:foo ys zs=\powerIt->map powerIt zs\x->x^y
现在,在实际的实现中,这些去语法并不是完全以这种方式发生的,有时不同的子句由于涉及效率的原因被编译器区别对待。但核心问题仍然存在——lambdas功能强大且价格昂贵,可以为我们提供一种简单易懂的核心语言,尽管我们在其上叠加了多种绑定形式
没有lambdas,我们就有了一种语言,在这种语言中我们可以定义变量,定义函数,然后有时我们可以用函数做某些事情。有了lambdas,我们就有了一种语言,在这种语言中,函数和其他任何值一样都是值,我们有一套统一的方法为任何东西指定名称
相反的观点是,lambdas不是一个特例,而是一个普通案例,我们所有其他各种名称绑定机制都是它们的糖。我相信维基百科会回答您的问题。参见,例如.s/practice part/practice purpose/?别忘了你可以写得更简洁:map*2[1..5]简短的回答是为什么你不这样做?显然,你并不需要它,但它最终会让你的生活变得更轻松。最后,它与列表的文字语法一样引人注目,而不是0:1:2:[]。我在年说过这样的话。我相信维基百科会回答你们的问题。参见,例如.s/practice part/practice purpose/?别忘了你可以写得更简洁:map*2[1..5]简短的回答是为什么你不这样做?显然,你并不需要它,但它最终会让你的生活变得更轻松。最后,它与列表的文字语法一样引人注目,而不是0:1:2:[]。我在中说过这样的话。我应该注意到,从历史上看,let没有像上面那样转换为lambda的原因是let绑定是多态的,而lambda函数的参数在默认情况下是单态的。但是现代ghc正在消除let绑定的默认泛化,这使得转换更加简单。我应该注意到,从历史上看,let不转换为lambda的原因是let绑定是多态的,而lambda函数的参数在默认情况下是单态的。但是现代ghc正在消除let绑定的默认泛化,这使得转换更加简单。