2012-03-29 39 views
2
rho x = map (((flip mod) x).(\a -> a^2-1)) (rho x) 

这个函数会产生一个无限列表。我在GHCI测试,功能类型是为什么Haskell能演绎[]在这个函数中输入

*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 

我的问题是,如何才能哈斯克尔演绎函数类型为b - > [b]?我们在这个函数中没有任何[]类型的数据。谢谢!

回答

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)与函数组合的类型相结合,所以我们知道这个b与前一个相同。

rho :: Integral b => b -> [b] 
6

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

相关问题