为什么flip id被接受为有效表达式?它不应该在对b -> c进行a类型检查时失败吗
Prelude> :t flip
flip :: (a -> b -> c) -> b -> a -> c
Prelude> :t id
id :: a -> a
Prelude> :t flip id
flip id :: b -> (b -> c) -> c发布于 2015-04-07 19:08:54
重点是
id :: a -> a用于任何类型的a,包括函数类型。也就是说,我们可以选择a = (b -> c)并获取
id :: (b -> c) -> (b -> c),因为->关联到右边,所以通常写成
id :: (b -> c) -> b -> c上面的代码可以解释为一个带有两个参数的函数:第一个参数类型为b -> c,第二个参数类型为b。这样我们就可以flip它了。
发布于 2015-04-07 19:09:06
id类型中的a可以匹配任何类型,特别是(b->c)。
Prelude> :t id :: (b -> c) -> (b -> c)
id :: (b -> c) -> (b -> c) :: (b -> c) -> (b -> c)->是右关联的,所以我们可以去掉最右边的一组括号
Prelude> :t id :: (b -> c) -> b -> c
id :: (b -> c) -> b -> c :: (b -> c) -> b -> c使id成为一个双参数函数。
https://stackoverflow.com/questions/29489905
复制相似问题