【问题标题】:"Empty" traversable - does it make sense, is it provided in any library?“空”可遍历-有意义吗,是否在任何库中提供?
【发布时间】:2019-04-28 19:05:37
【问题描述】:

我正在编写一段使用 Traversable 抽象的 Haskell 代码。在这个抽象背后,我希望能够隐藏所有常规的可遍历结构,如列表、树、地图等,特殊情况 Data.Functor.Identity.Identity 作为包含单个值的基本结构。我还想介绍一个“空”结构的情况。这种“空”的可遍历实例是否存在?也许它已经由任何库提供?

我第一次(也许是天真的)尝试定义这样的实例如下。有意义吗?

data Empty a = Empty

instance Functor Empty where
    fmap _ _ = Empty

instance Foldable Empty where
    foldr _ init _ = init

instance Traversable Empty where
    sequenceA _ = pure Empty

【问题讨论】:

  • 次要:注意“空”可能是一个误导性的名称,因为Empty a 有一个值,即Empty。有人可能会期望空类型没有(非底部)值,例如库中的 Void,或者(使用 GHC 扩展)data Empty a 没有任何构造函数。

标签: haskell traversable


【解决方案1】:

base 中的类型而言,Proxy 正是如此。 Const () 也可以。 (还有U1,但这是泛型机制的一部分,在其他情况下可能会觉得有点不合适。)

【讨论】:

  • 谢谢,这正是我一直在寻找的,它的实现和我的一样,很高兴知道它已经在基地里了。
  • @ErykCiepiela Proxy 通常用于允许调用者将类型“传递给函数”。例如。如果f :: SomeClass a => Proxy a -> Int 调用者可以选择a 使用类似f (Proxy :: Proxy Bool) 的东西。如果没有代理参数,类型会变得不明确并被拒绝(好吧,现在 GHC 也可以允许这些,实际上我更喜欢不明确的类型 + 类型参数作为一种风格,但让我们忽略这一点)。如果这是您在Empty a 背后的意图,请改用Proxy。否则,Const () 可能更适合表明您的意图(虽然很难说)。
  • @chi 我想知道在这种情况下使用Proxy 会有多自然的感觉,但后来我看到了this comment by Edward Kmett,这让我有足够的信心在此提及它。
猜你喜欢
  • 2017-07-06
  • 1970-01-01
  • 2014-03-03
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2012-08-16
  • 1970-01-01
相关资源
最近更新 更多