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]?我们在这个函数中没有任何[]类型的数据。谢谢!
答案 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]
这意味着a
和b
属于同一类型,因此:
rho :: ? -> [b]
如果我们检查映射函数并使x
空闲,我们会找到类型:
\x -> ((flip mod) x).(\a -> a^2-1) :: Integral b => b -> (b -> b)
Integral b => b
为我们提供x
的类型,(b -> b)
与函数组合的类型统一,因此我们知道此b
与rho :: Integral b => b -> [b]
相同上一个。
{{1}}
答案 1 :(得分:6)
(rho x)
必须返回一个列表,因为它被传递给map
,并且列表元素的类型可以从映射中发生的内容中推断出来。