gpt4 book ai didi

haskell - 用于数据类型字段提取的模式匹配 vs 记录语法函数

转载 作者:行者123 更新时间:2023-12-03 14:49:09 25 4
gpt4 key购买 nike

给定一个具有记录语法的示例数据类型:

data VmInfo = VmInfo {infoVid   :: String
,infoIndex :: Int
,infoPid :: Int
,infoExe :: String
} deriving (Show)

和 (vmInfo::String -> VmInfo) 函数,它生成并返回给定 vm 名称为字符串的上述数据结构。

我可以看到两种方法来提取 VmInfo 数据类型的各个部分。
(VmInfo vid _ _ _) <- vmInfo vm

这只是一个模式匹配。和 ...
vid <- infoVid <$> vmInfo vm

使用记录语法编译器生成的函数。

问题很简单:哪种方法是首选方法?

明智的打字量它们是相同的,所以我正在寻找速度和正确性/最佳实践。

我假设模式匹配会更快,但是记录语法有什么意义呢?

谢谢。

最佳答案

这些在语义上并不等效。

让我们看第一个例子:

(VmInfo vid _ _ _) <- vmInfo vm

这将在绑定(bind)操作中执行模式匹配。这有两个结果。第一个是 vmInfo vm结果的构造函数 Action 被评估。这意味着如果 vmInforeturn undefined 之类的行结束,通过评估 undefined 引发的异常将在此模式匹配中发生,而不是稍后使用 vid .第二个是如果模式匹配被驳回(模式匹配不匹配值),monad的 fail将使用模式匹配错误文本调用实例。在这种情况下这是不可能的,但通常在模式匹配绑定(bind)中的构造函数时是可能的。

现在,进入下一个示例:
vid <- infoVid <$> vmInfo vm

根据 <$> 的定义,这将在 Action (而不是效果)返回的值中完全惰性。如果 vmInforeturn undefined 结尾,您不会从评估 undefined 中得到异常直到你做了一些使用 vid 的值的事情.此外,如果 infoVoid有能力抛出任何异常,直到使用 vid 才会发生。 ,最好的情况。

有趣的是,这些差异只存在于单子(monad)绑定(bind)的范围内。如果 vmInfo是纯的,你绑定(bind)的名字 vidlet 内或 where表达式,它们将生成相同的代码。

在这种情况下,您要使用哪一个完全取决于您。两者都是惯用的 Haskell。人们通常会选择在他们工作的环境中看起来更好的那个。

人们使用访问器函数的主要原因是简洁,因为记录具有如此多的字段,模式匹配很大,并且因为它们是实际函数 - 它们可以传递给其类型适合的任何高阶函数。您不能将模式匹配作为不同的构造传递。

关于haskell - 用于数据类型字段提取的模式匹配 vs 记录语法函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10291550/

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