Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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函数组合($)和函数应用($)习惯用法:正确使用_Haskell_Coding Style_Function Composition - Fatal编程技术网

Haskell函数组合($)和函数应用($)习惯用法:正确使用

Haskell函数组合($)和函数应用($)习惯用法:正确使用,haskell,coding-style,function-composition,Haskell,Coding Style,Function Composition,我一直在阅读真实世界的Haskell,我已经接近尾声了,但是风格问题一直困扰着我,让我去处理(.)和($)操作符 当您编写一个由其他函数组成的函数时,您可以这样编写: f = g . h 但当你在这些函数的末尾应用一些东西时,我会这样写: k = a $ b $ c $ value k = a . b . c $ value k = a (b (c (value))) 但这本书是这样写的: k = a $ b $ c $ value k = a . b . c $ value k =

我一直在阅读真实世界的Haskell,我已经接近尾声了,但是风格问题一直困扰着我,让我去处理
(.)
($)
操作符

当您编写一个由其他函数组成的函数时,您可以这样编写:

f = g . h
但当你在这些函数的末尾应用一些东西时,我会这样写:

k = a $ b $ c $ value
k = a . b . c $ value
k = a (b (c (value)))
但这本书是这样写的:

k = a $ b $ c $ value
k = a . b . c $ value
k = a (b (c (value)))
现在,在我看来,它们在功能上是等价的,在我眼中,它们做着完全相同的事情。然而,我看得越多,就越能看到人们以书中的方式编写函数:首先使用
()
组合,然后仅在最后使用
($)
附加一个值来评估批次(没有人使用许多美元组合)


使用书本的方式是否比使用所有的
($)
符号要好得多?或者这里是否有一些我没有得到的最佳实践?或者这是多余的,我根本不应该担心它?

这只是风格的问题。然而,这本书的写作方式对我来说更有意义。它组合所有函数,然后将其应用于值

您的方法看起来很奇怪,最后一个
$
是不必要的


然而,这真的不重要。在哈斯克尔,通常有很多很多正确的方法来做同样的事情。

我想我可以从权威那里回答这个问题

使用书本的方式是否比使用所有($)符号要好得多


没有什么特别的原因。布莱恩和我都喜欢减少线路噪音<代码>比
$
安静。因此,本书使用了
f。Gh$x
语法。

它们实际上是等价的:请记住,
$
操作符基本上什么都不做
f$x
计算结果为
fx
$
的目的是它的固定性行为:右关联和最小优先级。删除
$
并使用括号进行分组,而不是使用中缀优先级,代码段如下所示:

k = a $ b $ c $ value
k = a . b . c $ value
k = a (b (c (value)))

选择
版本而不是
$
版本的原因与选择以上括号中的版本的原因相同:美观


尽管有些人可能会想,使用中缀运算符而不是括号是否是出于某种潜意识的冲动,以避免与Lisp有任何可能的相似之处(我想是开玩笑吧?)

对我来说,我认为答案是(a)整洁,如;(b)我发现当我编辑代码时,我的函数可能会以无点方式结束,然后我所要做的就是删除最后一个
$
,而不是返回并更改所有内容。当然,这是一个小问题,但很准确。

关于这个问题的讨论很有趣。显然,有少数观点认为,
$
的正确关联性是,并选择
f。Gh$x
over
f$g$h$x
是回避问题的一种方式。

我要在
f中添加这一点。g$x
f。g
是一个有意义的句法单位

同时,在
f$g$x
中,
f$g
不是一个有意义的单位。一系列的
$
可能更为必要——首先得到
x
g
的结果,然后对它执行
f
,然后对它执行
foo
,然后依此类推


与此同时,
链可以说更具声明性,在某种意义上更接近于以数据流为中心的视图——组成一系列函数,并最终将它们应用于某些东西。

我意识到这是一个非常古老的问题,但我认为还有另一个原因没有提到

如果您正在声明一个新的无点函数
f。Gh
,将自动应用您传入的值。但是,如果您编写
f$g$h
,它将不起作用


我认为作者之所以喜欢组合方法,是因为它带来了构建函数的良好实践。

好吧,我不希望有比这个更好的答案;来自其中一位作者本人。:)这是有道理的,当我阅读时,它在页面上看起来确实安静多了。将此标记为答案,因为它直接回答了问题。谢谢你的回复;事实上,还有这本书。我并不反对作者的观点,但我认为在创造某种东西而不是使用它的思维模式中还有另一个更突出的原因。Haskell用户倾向于将
f.g.h
视为一种新的聪明创造,而不是
f(g(h())
。现在他们正在调用一个新的,尽管是匿名的,他们创建的函数,而不是像PHP用户一样链接一个大的预制函数调用字典。我从来没有想过用这个术语来描述编程语言,但它非常有意义。我没有注意到最后一美元是不必要的,但我应该这样做。谢谢,我会把它放在那里,让人们知道这条评论的意思。是的,这是这样写的一个很好的理由,如果你想在函数合成中结束,那么它会更快。:)是的,节省了击键,但更重要的是节省了时间+1请注意,第二个示例可以作为
k=a$b$c值来完成
是的,它可以,正如Zifre在下面提到的,但我决定把它放在那里,因为它不会损害任何东西,并且使他的(现在是你的)评论有意义。谢谢你+1:)另一种常见的方法是
a。b$c值
,我不像第三个示例那样喜欢它,但节省了几个字符。嘿,你找到了关于这个问题的完整讨论。太棒了,我现在正在读书+1此处的类似参数:请注意
$
还具有“完全错误”的正确关联性--。我正在学习Haskell(没有编写任何有意义的代码),但我喜欢考虑$a