我试图了解如何将 Haskell 中的函数转换为无点表示法。我看见这个例子 https://stackoverflow.com/questions/2464406/point-free-in-haskell,但它比我正在寻找的更复杂。我觉得我理解其背后的逻辑,但是当我尝试在代码中执行一些简单的示例时,我遇到了编译错误。我想尝试以无点风格编写这个函数:
f x = 5 + 8/x
我将其重新排列为f x = (+) 5 $ (/) 8 x
所以,我想可能是这样的:
f = (+) 5 $ (/) 8
但是当我在 ghci 中运行它时,我收到以下消息:
No instance for (Num (a0 -> a0))
arising from the literal `5' at Test.hs:3:9
Possible fix: add an instance declaration for (Num (a0 -> a0))
In the first argument of `(+)', namely `5'
In the first argument of `($)', namely `(+) 5'
In the expression: (+) 5 $ (/) 8
Failed, modules loaded: none.
我不明白“没有实例......”消息。我需要做什么才能以无点风格编写这个函数?
$
优先级非常低。所以,f x = (+) 5 $ (/) 8 x
实际上意味着f x = (+) 5 $ ((/) 8 x)
。相反,将其重写为
f x = (+) 5 ( (/) 8 x)
f x = ((+) 5) ( ((/) 8) x)
f x = ((+) 5) . ( ((/) 8) ) x
f = ((+) 5) . ( (/) 8 )
f = (5+) . (8/)
最后一个表达式是有意义的:f 是两个运算的组合,首先将 8 除以一个运算,然后将结果加上 5。记住,g.h
意思是“应用 h,然后应用 g 的结果”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)