【问题标题】:why Haskell can deduce [] type in this function为什么 Haskell 可以在这个函数中推导出 [] 类型
【发布时间】:2012-03-29 05:18:41
【问题描述】:
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]?我们在这个函数中没有任何 [] 类型的数据。谢谢!

【问题讨论】:

    标签: haskell types


    【解决方案1】:

    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]
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 1970-01-01
        • 2014-04-30
        相关资源
        最近更新 更多