gpt4 book ai didi

haskell - 这个模式匹配发生了什么?

转载 作者:行者123 更新时间:2023-12-02 18:26:14 26 4
gpt4 key购买 nike

在Data.List中,我看到了这个陌生的模式匹配:

{-# NOINLINE [1] unsafeTake #-}
unsafeTake :: Int -> [a] -> [a]
unsafeTake !_ [] = []
unsafeTake 1 (x: _) = [x]
unsafeTake m (x:xs) = x : unsafeTake (m - 1) xs

我的理解是 ! 删除了 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)

并且该字段是严格的,意味着如果第一个参数恰好是底部,则程序将停止:

unsafeTake (error "kaboom") [] 

这将引发带有严格注释的 kaboom,但如果没有它,则不会发生。

您还可以将 Bang Pattern 放入数据类型定义中:

data Tree a = Branch (Tree a) !a (Tree a)
| Empty

然后它总是将包含 a 的字段评估为其弱头范式。这意味着它不会评估整个结构。来自 haskell wiki

  • 构造函数(最终应用于参数),例如 True、Just (square 42) 或 (:) 1
  • 应用于太少参数(可能没有)的内置函数,例如 (+) 2 或 sqrt。
  • 或 lambda 抽象\x -> 表达式。

关于haskell - 这个模式匹配发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41229489/

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