gpt4 book ai didi

haskell - 为什么Guard基于Alternative?

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

为什么是 guard基于 Alternative ?

guard :: Alternative f => Bool -> f ()
-- guard b is pure () if b is True,
-- and empty if b is False.

我问是因为 guard仅使用 empty来自 Alternative .它不使用 <|>来自 Alternative一点也不。那么为什么还要使用 Alternative首先?

我猜这是因为 Alternative 背后有一些未说明的想法。的 empty这与我们试图通过 guard 实现的目标完美匹配(停在 False 上,继续在 True 上)。如果是这种情况,请告诉我这个未说明的想法。

但同时,如果觉得我们只是忽略了 <|> .感觉就像 guard不是“完全捕捉”什么 Alternative是所有关于。我希望这是有道理的。更具体地说:他们为什么不发明另一种类型类,称为 Stoppable (或 Abortable )并使用它代替 Alternative ?

最佳答案

TL;DR: 历史原因。 MonadPlus 中的设想是这样的,得到它的Applicative变体 Alternative后来,也没人提议拆分Alternative进入 AZeroAChoice或类似的。
Alternative是一个相对较新的想法,就像 Applicative .返回时 guard最初设想,它基于 MonadPlus , 一个 Monad应该支持选择和失败,就像 Alternative .它的原始类型是这样的

guard :: MonadPlus m => Bool -> m ()

这是在 Haskell 98 报告中指定的,其中 MonadPlus 已经注意到了。顺便说一句,Haskell 1.0 根本没有使用 monad。当 Applicative终于得到了 Monad的父类(super class), Alternative有一个父类(super class) MonadPlus , 和 mzero = emptymplus = (<|>) .

好吧,现在我们知道为什么了 guard使用 Alternative .因为它是基于 MonadPlus预先。那么为什么是 MonadPlus是这样定义的?

必须给 SPJ 或委员会的其他人写一封邮件才能从 1998 年获得他们的理由,因为仅仅一年后, Erik Meijer and Graham Hutton wrote their "Monadic Parsing in Haskell"纸。如果你看一下论文,你会注意到他们的 MonadPlus就像你想要的那样工作:

class Monad m => MonadZero m where
zero :: m a

class MonadZero m => MonadPlus m where
(++) :: m a -> m a -> m a


因此,当然可以按照您描述的方式处理这种“可停止”。但是,根本没有 base当前定义 empty 的类没有 Alternative .可能有一个,但尚未提出。

请注意,这是 Haskell 类中反复出现的主题。 Monoid包含 mappendmempty .在它的构思之后,有人注意到有某些类型, mappend有道理,但不是 mempty .例如
newtype Min a = Min a

combine :: Ord a => Min a -> Min a -> Min a
combine (Min x) (Min y) = Min (min x y)

在这里, mappend = combine显然是关联的,而空的 Min如果我们只使用 Ord 是不可能的,我们将不得不使用 Bounded .这就是为什么现在有 Semigroup ,它不是 Monoid 的基类然而,但是给了我们关联操作。

回到你原来的问题: guard使用 Alternative , 因为 Alternative提供 empty , 和 empty在某些 Alternative 中“停止”评估的。没有其他类包含它, .

但是有一个提案,在某个时候可能会有,虽然我不确定社区对拆分 Alternative 的看法是什么是。

顺便说一句,像 PureScript 这样的语言 split 了 Alternative ,虽然他们反过来分开了……

更多关于 Alternative 的信息以及为什么我使用 Monoid另一个例子,见 Confused by the meaning of the 'Alternative' type class and its relationship to other type classes .

关于haskell - 为什么Guard基于Alternative?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44696944/

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