如何在Haskell中编写没有括号的函数?

时间:2014-05-21 14:59:24

标签: haskell

我想弄清楚第500个斐波纳契数是多少位数:

fib n = fibs (0,1) !! n where 
    fibs (a,b) = a:fibs(b,(a+b))
length (show (fib 500))

这确实有效。有没有办法摆脱第三行的括号?说 length . show . fib 500或类似的东西?

这种美元形式也有效:

length $ show $ fib 500

一般来说,在这种情况下推荐的方式是什么?

3 个答案:

答案 0 :(得分:10)

典型风格:

length . show $ fib 500

只有作品:

length . show . fib $ 500

优选组合的一个优点是您可以轻松地提取常见的子功能。也许你需要在其他地方length . show,所以你可以轻易地将它移到其他地方并给它一个名字;但是,show . fib可能没那么有用。 :)

你说的话:

length . show . fib 500

与:

相同
\x -> length (show (fib 500)) x

编译器认为这是荒谬的,因为你像函数一样使用Int

答案 1 :(得分:5)

你几乎得到了它:

length . show . fib $ 500

您可以在pointless style中为此

定义一项功能
lengthOfFib = length . show . fib

然后像这样使用它

lengthOfFib 500

答案 2 :(得分:3)

我通常会使用圆点来组成除最后一个之外的所有函数。例如:

length . show $ fib 500
this . that . theOther . length . show $ fib 500

你也可以把它写成:

(length . show . fib) 500
(this . that . theOther . length . show . fib) 500