haskell - 为什么 Haskell 可以在这个函数中推导出 [] 类型

标签 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]?我们在这个函数中没有任何 [] 类型的数据。谢谢!

最佳答案

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]

关于haskell - 为什么 Haskell 可以在这个函数中推导出 [] 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9919482/

相关文章:

haskell - 为什么以下代码会在下一行代码处导致“解析错误(可能是缩进不正确或括号不匹配)”

Haskell:如何在使用未装箱向量时修复 "add An Instance Declaration For (Unbox A)"错误?

ios - Swift 中的类型转换

java - JPA 在需要类型转换的字段上定义关系

haskell - 在导管顶部设计一个库

haskell - 解决极端情况 Haskell 模块导入和导出

loops - Haskell - for 循环

允许具有多种数据类型的 Javascript 参数 : good practice or not?

c# - 检查类型最快的方法是什么?

sql - 从时间戳列中删除时间部分