list - Haskell 列表理解(为列表元素打印 sqrt)

标签 list haskell list-comprehension

我有 GHCi,版本 7.8.3。我想计算可被 10 整除的 sqrt 项的总和。

如果我写 [ x | x <- [10..100], x `mod` 10 == 0]sum [sqrt x | x <- [10..100]]是正确的。

但是如果我写 sum [ sqrt x | x <- [10..100], x `mod` 10 == 0]当显示错误时:

'<interactive>:39:1:
    No instance for (Show t0) arising from a use of ‘print’
    The type variable ‘t0’ is ambiguous
    Note: there are several potential instances:
      instance Show Double -- Defined in ‘GHC.Float’
      instance Show Float -- Defined in ‘GHC.Float’
      instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
        -- Defined in ‘GHC.Real’
      ...plus 23 others
    In a stmt of an interactive GHCi command: print it'

怎么改命令,那个程序是正确的?

最佳答案

问题来自这样一个事实,即当您使用 mod 时,数字的类型必须是 Integral a => a ,以及当您使用 sqrt 时数字类型必须是Floating a => a . GHC 知道没有任何类型适合这两个约束,尽管因为您在 GHCi 中执行它,无论出于何种原因的错误消息几乎都是无用的。错误信息是这样的,因为 GHCi 使用 print , 调用 show ,出于某种原因,这是第一个被检查的约束。由于没有类型具有约束 Show , Integral , 和 Floating ,它不进行类型检查。

您的另外两个示例类型检查,因为它们仅使用 mod 之一或 sqrt .您可以使用 fromIntegral 获得两者的组合。申请前sqrt :

sum [sqrt $ fromIntegral x | x <- [10..100], x `mod` 10 == 0]

关于list - Haskell 列表理解(为列表元素打印 sqrt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29099693/

相关文章:

python - 根据公共(public)属性对两个对象列表进行排序

java - 在 Java 中使用 Hibernate 更新实体列表

haskell - 不使用 monadic bind 使用循环写下 mfix 的情况

haskell - 如何使用 Yesod 的 Persistent 创建带有子数组的 MongoDB 文档?

python - 生成具有对角边缘的数组的 Pythonic 方法是什么?

列出包 `MoveToFront` 不适合我

string - 从 Common Lisp 中的字符串中选择随机字符

Haskell 工具堆栈和可执行文件大小

python-3.x - 将嵌套列表转换为字典 | Python

python - 双 for 循环列表理解