Wil*_*sem 7
Haskell 将首先遍历整个列表,然后检查
null
.
没有。null
检查它是否为空列表,并返回空True
列表[]
和数据构造函数。“旧”被实现为 [src]:False
(:)
null
null :: [a] -> Bool null [] = True null (_:_) = False
因此,它会将列表推导评估为头范式(HNF),并且一旦它知道它可以返回的外部数据构造函数True
:False
它不会检查第一个元素是什么,所以如果这是一个昂贵的表达式,它不会浪费那个时间。
“新”null
实现为 [src]:
null :: t a -> Bool null = foldr (\_ _ -> False) True
列表在哪里foldr
实现为 [src]:
foldr k z = go where go [] = z go (y:ys) = y `k` go ys
因此,它也将简单地检查外部数据构造函数是空列表[]
还是“cons” (:)
,因为在这种情况下k
返回True
并且对参数不感兴趣。
列表推导也是惰性的:它们只会在必要时评估外部数据构造函数,并在必要时构造头部和尾部。您的列表理解被取消为:
concatMap (\x -> if x == s1 then [x] else []) s2
如果它因此必须评估列表的外部数据构造函数,它将迭代s2
,如果x == s1
那么它将产生作为外部数据构造函数的“cons”,然后null
可以使用它来确定列表是否为空。
因此,这意味着x
从s2
哪里找到元素的那一刻起x == s1
,它就会返回False
。
更多推荐
惰性,条件,列表,Haskell
发布评论