一个我试图定义一个函数如下练习:Haskell的类型不明确
twice f x = f (f x)
当我打印类型的两次我看到:
Main> :t twice
twice :: (a -> a) -> a -> a
不知道我理解的在这里输出。因此twice
需要输入类型函数(类型为a -> a
)。它是否正确?如果是这样,f
如何评估为功能类型(a -> a
)?那么这里的twice
的退货类型是什么?
一个我试图定义一个函数如下练习:Haskell的类型不明确
twice f x = f (f x)
当我打印类型的两次我看到:
Main> :t twice
twice :: (a -> a) -> a -> a
不知道我理解的在这里输出。因此twice
需要输入类型函数(类型为a -> a
)。它是否正确?如果是这样,f
如何评估为功能类型(a -> a
)?那么这里的twice
的退货类型是什么?
twice f x = f (f x)
twice :: (a -> a) -> a -> a
它是这样的。
f
是a -> a
型的,x是a
型的,f (f x)
是a
类型。
你应该通过f
为a -> a
功能,如* 2
是的,这是正确的。
f
的类型为a -> a
这需要x
其中有一个类型的a
,应该能够再次使用他的输出,所以输出应该是相同类型的输入。
而twice
与f
具有相同的输出类型,因此a
。
这给了我们这样的:
twice :: (a -> a) -> a -> a
twice f x = f (f x)
啊现在我明白了。那么如何评估'f'的类型为a-> a。口译员是如何推断它是什么类型的?我没有在任何地方定义'f'。 – patronus
有人似乎在这里问过类似的问题:https://stackoverflow.com/questions/42243902/haskell-function-type-clarification?rq=1 – patronus