首页 > 解决方案 > 为什么 a -> b -> c 函数参数可以接受 a -> a 类型?

问题描述

这编译成功:

test = f id
f :: (a -> b -> c) -> String
f g =  "test"

id有 type a -> a,但f有 type 的第一个参数(a -> b -> c)

我认为它不应该编译。我不明白。

标签: haskell

解决方案


因为您可以绑定未实例化的变量。f :: (a -> b -> c) -> String表示对于任何 3 种类型 a、b 和 c,f 采用从 a 到 b 到 c 的函数并返回字符串。

重要的是要记住这f :: (a -> b -> c) -> String相当于f :: (a -> (b -> c)) -> String因为 currying。

id接受任何类型,并返回该类型。

因此,如果我们将其换入,id是返回b -> c,并采取a,所以如果acan be b -> cwhich it can as a can 是任何类型,那么这很好。


推荐阅读