~ 在 (l, r) 之前是什么意思
What is the meaning of ~ before (l, r)
我读了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
成为一个好的主播。否则,它必须先评估整个列表,然后才能 return 它的任一结果的第一个元素(因为例如 left
会强制传入对,这是由递归调用生成的,这将有强制其传入对,依此类推...)。
我读了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
成为一个好的主播。否则,它必须先评估整个列表,然后才能 return 它的任一结果的第一个元素(因为例如 left
会强制传入对,这是由递归调用生成的,这将有强制其传入对,依此类推...)。