【问题标题】:Haskell list comprehension with "x is drawn from a function"Haskell 列表理解与“x 是从函数中得出的”
【发布时间】:2011-04-17 04:29:13
【问题描述】:

下面以digits 开头的代码返回一个整数列表。以altSumOfDigits 开头的代码应该返回相同的列表,但 Prelude 却在抱怨类型错误,我现在不明白。

Couldn't match expected type `a' against inferred type `Integer'


digits' :: Integer -> [Integer]
digits' 0 = []
digits' x = (x `mod` 10) : digits' (x `div` 10)

digits :: Integer -> [Integer]
digits 0 = [0]
digits x = reverse $ digits' x

altSumOfDigits :: Integer -> [a]
altSumOfDigits num = [ x | x <- (digits num)]

(我知道altSumOfDigits num = [ x | x &lt;- (digits num)] 在这种形式下相当无用。稍后我将使用 if 表达式和对单个整数的操作来扩展它的功能。) 任何解释为什么这不起作用?

【问题讨论】:

    标签: list function haskell types


    【解决方案1】:

    更改(或删除)altSumOfDigits 的类型以返回 [Integer]


    在问题中包含错误是很好的形式,这里是:

    Couldn't match type `a' with `Integer'
    

    altSumOfDigits 的类型采用Integer 的列表,但根据您声明的类型返回任何类型的a 列表。所以它的返回类型是多态的。

    但是,您从altSumOfDigits 中调用digits,这必须只返回Integer 的列表。因此,您的altSumOfDigits 无法返回除[Integer] 列表之外的任何内容。

    【讨论】:

    • 所以类型 [a] 不仅仅是 [Integer] 的超类型。我认为 [a] 或 solo a(或任何带有 a 的东西)可以作为任何其他类型的占位符。谢谢你的收获。
    • 不,不是占位符。这是您向编译器声明的要求,它必须适用于所有类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2022-01-08
    相关资源
    最近更新 更多