【问题标题】:Haskell define a non-empty list datatypeHaskell 定义一个非空列表数据类型
【发布时间】:2015-09-03 20:52:31
【问题描述】:

我已经定义了一个这样的数据类型来表示一个二维点:

data Point = Point (Double, Double) deriving (Show)

还有一个数据类型曲线(曲线是二维空间中创建曲线的点的列表

data Curve  = Curve [Point] deriving (Show)

如何将曲线数据类型设置为非空?所以它总是需要在列表中至少有 1 个点?

【问题讨论】:

  • 一种简单的方法是data Curve = Curve Point [Point]。此外,出于性能原因,您可以使用newtype 而不是data 来定义Point
  • 现有类型按照@Jubobs 建议的方式定义:NonEmptyT(黑线鳕警告:Thielemann)、NonEmpty
  • @DanielWagner,为什么 Henning 值得警告?他的图书馆有什么我没有注意到的问题吗?
  • @dfeuer 黑线鳕很难阅读,因为每种类型都被命名为T,每个类都被命名为C。在代码中,这很好,因为他的风格是导入所有合格的东西(所以看起来像 NonEmpty.TRing.C),但黑线鳕并没有真正优雅地处理这种风格,导致类型签名看起来像 (C a, C b) => T a -> T b -> T -> T和其他难以辨认的废话。

标签: list haskell types


【解决方案1】:

Data.List.NonEmpty 模块,在流行的semigroups 库中,实现了一个非空列表类型和实用函数。

该解决方案实际上与 Cactus 的答案相同,一对包含强制性的第一个元素,然后是其余元素的列表:

data NonEmpty a = a :| [a]

所以 Cactus 的 Curve 类型将等同于 NonEmpty Point

【讨论】:

    【解决方案2】:

    [Point] 列表将始终包含 0 个或多个 Points,因此如果您存储一个额外的,您将得到 1 +(0 或更多)=1 或 morePoints:

    data Curve = Curve Point [Point]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2019-08-25
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多