twice :: (a -> a) -> a -> a
twice f x = f (f x)
此功能适用两次,但我无法弄清楚它如何应用3次。我试过了:
threeTimes:: (a -> a) -> a -> a -> a
threeTimes f x = f (f(fx))
以及许多其他方式,但无法提出解决方案。任何帮助将不胜感激。
答案 0 :(得分:3)
你有两个问题,一个是简单的错字,另一个是概念问题。
threeTimes
的类型与twice
的类型完全相同;你给它一个函数和一个参数。
threeTimes :: (a -> a) -> a -> a
身体很好;你忘记了f
和x
之间的空格; fx
是未定义的名称。
threeTimes f x = f (f (f x))
twice
和threeTimes
之间的相似性如果用无点样式编写它们会更加明显(比通常强调类似部分的空格要多一点):
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))