为什么Haskell可以在此函数中推导出[]类型

时间:2012-03-29 05:18:41

标签: haskell types

rho x = map (((flip mod) x).(\a -> a^2-1)) (rho x)

此函数将生成无限列表。我在GHCi中测试过,函数类型是

*Main> :t rho
rho :: Integral b => b -> [b]

如果我定义这样的函数

fun x = ((flip mod) x).(\a -> a^2-1)

类型是

*Main> :t fun
fun :: Integral c => c -> c -> c

我的问题是,Haskell如何将函数类型推导为b - >并[b]?我们在这个函数中没有任何[]类型的数据。谢谢!

2 个答案:

答案 0 :(得分:14)

map具有以下类型:

map :: (a -> b) -> [a] -> [b]

因此,我们可以推导出map的参数类型:

(((flip mod) x).(\a -> a^2-1)) :: (a -> b)
(rho x) :: [a]

map的结果也是rho x的结果,所以:

(rho x) :: [b]

这意味着ab属于同一类型,因此:

rho :: ? -> [b]

如果我们检查映射函数并使x空闲,我们会找到类型:

\x -> ((flip mod) x).(\a -> a^2-1) :: Integral b => b -> (b -> b)

Integral b => b为我们提供x的类型,(b -> b)与函数组合的类型统一,因此我们知道此brho :: Integral b => b -> [b] 相同上一个。

{{1}}

答案 1 :(得分:6)

(rho x)必须返回一个列表,因为它被传递给map,并且列表元素的类型可以从映射中发生的内容中推断出来。