编写一个函数,它接受另一个函数和一个Int并应用它3次

时间:2017-10-27 00:14:57

标签: haskell

twice :: (a -> a) -> a -> a  
twice f x = f (f x)

此功能适用两次,但我无法弄清楚它如何应用3次。我试过了:

threeTimes:: (a -> a) -> a -> a -> a  
threeTimes f x = f (f(fx))  

以及许多其他方式,但无法提出解决方案。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

你有两个问题,一个是简单的错字,另一个是概念问题。

threeTimes类型twice类型完全相同;你给它一个函数和一个参数。

threeTimes :: (a -> a) -> a -> a

身体很好;你忘记了fx之间的空格; fx是未定义的名称。

threeTimes f x = f (f (f x))

twicethreeTimes之间的相似性如果用无点样式编写它们会更加明显(比通常强调类似部分的空格要多一点):

twice      f = f . f
threeTimes f = f . f . f

事实上,您可以简单地定义threeTimes f = f . twice f(或twice f . f;这两者是等价的,因为合成是关联的。)

答案 1 :(得分:1)

你的空间正在挡路。试试这个:

thrice :: (a -> a) -> a -> a
thrice f x = f $ f $ f x

这是对以下内容的同等声明:

thrice' :: (a -> a) -> a -> a
thrice' f x = f (f (f x))