Mic*_*ard 5 haskell pattern-matching
在Data.List中,我看到了这个不熟悉的模式匹配:
{-# NOINLINE [1] unsafeTake #-}
unsafeTake :: Int -> [a] -> [a]
unsafeTake !_ [] = []
unsafeTake 1 (x: _) = [x]
unsafeTake m (x:xs) = x : unsafeTake (m - 1) xs
Run Code Online (Sandbox Code Playgroud)
我的理解是!删除thunk.好的,但_被忽略了.有些东西我不理解.澄清表示赞赏.
那是一个BangPattern。它是一个注释,告诉编译器该函数在其第一个参数中应该表现严格。它相当于下面的代码:
unsafeTake :: Int -> [a] -> [a]
unsafeTake x [] = x `seq` []
unsafeTake 1 (x: _) = [x]
unsafeTake m (x:xs) = m `seq` (x : unsafeTake (m - 1) xs)
Run Code Online (Sandbox Code Playgroud)
该字段是严格的,意味着如果第一个参数恰好是底部,则程序将停止:
unsafeTake (error "kaboom") []
Run Code Online (Sandbox Code Playgroud)
这将引发带有严格性注释的 kaboom,但如果没有它,则不会发生。
您还可以将 Bang Pattern 放入数据类型定义中:
data Tree a = Branch (Tree a) !a (Tree a)
| Empty
Run Code Online (Sandbox Code Playgroud)
然后它总是将包含a 的字段评估为其弱头范式。这意味着它不会评估整个结构。来自哈斯克尔维基
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |