gpt4 book ai didi

haskell - 有 "unit"类吗?会有用吗?

转载 作者:行者123 更新时间:2023-12-03 14:55:44 24 4
gpt4 key购买 nike

是否存在具有单个单位值的类型的类(不确定此处的正确术语),即具有某些预定义值的类型?

class Unit a where
unit :: a

instance Unit () where
unit = ()

instance Unit (Maybe a) where
unit = Nothing

...适用于所有 Monoids、MonadPlus 等。

我想这个类的另一个名字可能是 Default .这对我来说最近两次有用。

可能没有说服力的例子:
extract :: (Unit r)=> Reader r a -> a
extract r = runReader r unit

这存在吗?其他人认为它可能有用吗?

最佳答案

是的,它可能会很有用。事实上,它的所有稍微不兼容的版本都会很有用!这有点问题。

甚至不清楚这样一个类意味着什么,这使得它很难实际使用,因为不可避免地你会遇到有多个默认值选择的类型,如果不能立即清楚实例提供了哪一个,那么你很漂亮很多人首先失去了类的所有好处。

几个例子:

  • 对于 Monoid实例,您显然希望标识元素是默认值。但是现在你又回到了这么多类型有两个或更多明智的问题 Monoid实例。是默认的Integer 0 还是 1?对于 Monoid ,标准库使用 newtype包装器,但它们很笨拙,并且很难使用包装类型——使用 Monoid它可以正常工作,因为您可以访问 mconcat等等,但你不能只用一个默认值做任何有趣的事情。
  • 对于 Functor - 具有“空”值的类型,提供明显的默认值。这就是 MonadPlusAlternative正在做...并且还与 Monoid 重叠,如果我没记错的话,至少有一种类型的三个实例不相同。当有多个选择时,你会选择哪一个?考虑列表:您可以盲目地附加它们,给出任意 Monoid ,以空列表为标识;但对于 Monoids 的列表你也可以zipWith mappend , 用 repeat mempty 给出一个提升的幺半群作为身份。许多仿函数有类似的Monoid实例,但并非总是两者兼而有之——因此,无论您选择哪个列表,您在概念上都会与其他一些 Functor 不一致!
  • 对于像 () 这样的单位类型,选择一个默认值并不难!但是枚举呢?选择第一个构造函数有意义吗?有时,但并非总是如此。使用该类(class)的人将如何知道?
  • Bounded 呢? ?如果以上都不适用,您可以使用 minBound .但上述某些类型可能是 Bounded同样,如果它们的默认值不是它们的最小值,你会混淆问题。

  • 基本上,有足够多的重叠似乎是有道理的......但实际上,您至少已经想到了三种不同的类型类,并且尝试统一它们可能不像最初看起来那么有用。

    如果您可以更好地确定事情并给出“默认”值的清晰一致的语义解释,而不仅仅是重新发明 Monoid或另一个现有的类,这样类型类就很容易使用,而不必停下来考虑选择什么“默认”,太棒了!但我不希望让它发挥作用。

    也就是说,任何标准类型类都没有涵盖的一个明显合理的情况是像 () 这样的单例。 .大多数情况下,这些并不是很有用——原因很明显!——这可能就是为什么没有这样的类(class)。但是,这样一个类非常有用的一个地方是,当你在做一些涉及类型级别恶作剧的事情时,因为这样的类型在类型和术语级别都代表一个值——所以这样的类型的类可以让你自由操作类型级别的值,然后想出与之相关的术语,因此您可以将其传递给其他函数,例如,基于它选择类型类实例。因此,我有 a class along those lines in my perpetually-incomplete type-hackery library ,例如:
    class TermProxy t where 
    term :: t

    -- This makes explicit the lexical pun of () having type ().
    instance TermProxy () where
    term = ()

    instance (TermProxy a, TermProxy b) => TermProxy (a, b) where
    term = (term, term)

    不过,我怀疑这样的类(class)在任何其他情况下都非常有用。

    关于haskell - 有 "unit"类吗?会有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451548/

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