2014-05-21 46 views
2

我试图找出第500 Fibonacci数多少个数字是:如何在Haskell中构造没有括号的函数?

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 

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

回答

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

或者,函数应用比任何其他中缀运算符具有更高的优先级,所以'长度。显示 。 fib 500'相当于'length'。显示 。 (fib 500)'。 – chepner

5

你几乎得到它:

length . show . fib $ 500 

可以在pointless style定义函数,这个

lengthOfFib = length . show . fib 

然后使用它像这样

lengthOfFib 500 
+0

哦,原来是他!我需要阅读更多的文档。 – Nick

3

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

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

你也可以写为:

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

“我通常会使用点来组合所有的功能,除了最后一个。”谢谢你的实用建议。 (length。show。fib)500这也使代码清晰。 – Nick

相关问题