gpt4 book ai didi

haskell - (l,r)之前的~是什么意思

转载 作者:行者123 更新时间:2023-12-02 05:25:37 25 4
gpt4 key购买 nike

我阅读了 Haskell 库

partitionEithers :: [Either a b] -> ([a],[b])
partitionEithers = foldr (either left right) ([],[])
where
left a ~(l, r) = (a:l, r)
right a ~(l, r) = (l, a:r)

(l, r) 之前的 ~ 是什么意思?

最佳答案

这是一个lazy pattern match 。这意味着模式匹配被假定为成功,并且仅在需要其数据时才实际执行。

ghci> strictPat (a,b) = "hello"
ghci> lazyPat ~(a,b) = "hello"

ghci> strictPat undefined
"*** Exception: Prelude.undefined
ghci> lazyPat undefined
"hello"

ghci> strictPat2 (a,b) = "the values are " ++ a ++ " and " ++ b
ghci> lazyPat2 ~(a,b) = "the values are " ++ a ++ " and " ++ b

ghci> strictPat2 undefined
"*** Exception: Prelude.undefined
ghci> lazyPat2 undefined
"the values are *** Exception: Prelude.undefined

这里使用它是为了让partitionEithers可以成为一个很好的流媒体。否则,它必须先评估整个列表,然后才能返回任一结果的第一个元素(因为例如 left 会强制传入对,该对是由递归调用生成的,这必须强制传入的对,依此类推...)。

关于haskell - (l,r)之前的~是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57278354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com