当前位置:  开发笔记 > 编程语言 > 正文

列表理解过滤的执行顺序

如何解决《列表理解过滤的执行顺序》经验,为你挑选了1个好方法。

刚开始学习Haskell并遇到了这个问题.如果我有一个列表理解与条件,如

[x*2 | x<- [1..10], x `mod` 3 ==2]

我明白了

[4,10,16]

正如所料.但是,如果我有

[x**2 | x<- [1..10], x `mod` 3 ==2]

对于mod函数,它的类型变量是不明确的.我认为这是因为x 2将一个整数提升为浮点数,但为什么这会影响条件?在这种情况下,为什么类型不明确?它计算x 2,然后平方根吗?(这似乎非常不可能)它是否以某种方式跟踪生成每个x 2项的x ?

也许这是势在必行的心态,但在内部,我认为执行将是[在python中]

lst=[]
for x in range(10):
 if x%3==2:
  lst.append(x**2)

有人可以澄清/纠正我的理解吗?



1> Zeta..:

让我们来看看类型mod(**):

mod  :: Integral n => n -> n -> n
(**) :: Floating a => a -> a -> a
     -- hm......

mod并对(**)使用的类型设置其他约束.mod期望一个整数类型(Int,Integer),而(**)期望一个浮动类型(Float,Double).由于没有类型的积分浮点数,GHC放弃了.

相反,使用(^):

(^) :: (Integral n, Num a) => a -> n -> a

例如

[x ^ 2 | x <- [1..10], x `mod` 3 == 2]

顺便说一句,如果您尝试为结果提供类型,则可以更轻松地找到这样的错误:

ghci> [x ** 2 | x <- [1..10], x `mod` 3 == 2] :: [Int]
:1:4:
    No instance for (Floating Int) arising from a use of `**'
    In the expression: x ** 2
    ...


@ Untitled123:是的,它总是试图先协调所有事情.在Haskell中有_no类型推进没有这样的东西!
推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有