2017-07-18 101 views
1

一个我试图定义一个函数如下练习:Haskell的类型不明确

twice f x = f (f x) 

当我打印类型的两次我看到:

Main> :t twice 
twice :: (a -> a) -> a -> a 

不知道我理解的在这里输出。因此twice需要输入类型函数(类型为a -> a)。它是否正确?如果是这样,f如何评估为功能类型(a -> a)?那么这里的twice的退货类型是什么?

回答

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

它是这样的。

fa -> a型的,x是a型的,f (f x)a类型。

你应该通过fa -> a功能,如* 2

+0

啊现在我明白了。那么如何评估'f'的类型为a-> a。口译员是如何推断它是什么类型的?我没有在任何地方定义'f'。 – patronus

+1

有人似乎在这里问过类似的问题:https://stackoverflow.com/questions/42243902/haskell-function-type-clarification?rq=1 – patronus

1

是的,这是正确的。

f的类型为a -> a

这需要x其中有一个类型的a,应该能够再次使用他的输出,所以输出应该是相同类型的输入。

twicef具有相同的输出类型,因此a

这给了我们这样的:

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