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_Abstraction_Lambda - Fatal编程技术网

Haskell 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函数参数中设置它。仅用于代码缩减?那为什么要提出这个抽象概念呢。代码缩减并不是什么大问题。为什么? 谢谢。并不是所有函数都被广泛使用,都值得一个名字。例如,如果您只使用此函数一次,那么对于此特定映射,您可能不想为其指定名称

我是Haskell编程新手。现在我学习lambda函数和lambda抽象。我想,lambda函数的练习部分是什么。例如,我们有:

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绑定的默认泛化,这使得转换更加简单。