【问题标题】:Generic Pattern in HaskellHaskell 中的通用模式
【发布时间】:2021-10-06 18:40:43
【问题描述】:

我希望 Haskell 的编译器能够理解 f v 在给定 Unfold v f 的情况下是类型安全的(尽管这是一项艰巨的任务)。

data Sequence a = FirstThen a (Sequence a) | Repeating a | UnFold b (b -> b) (b -> a)

有没有什么方法可以在不添加额外模板参数的情况下为数据类型封装通用模式。

(我知道针对这种特定情况使用惰性映射的解决方案,但我正在寻求更通用的解决方案)

【问题讨论】:

  • 您能否举一个导致 GHC 产生错误的示例并将错误消息包含在您的帖子中?

标签: haskell functional-programming pattern-matching algebraic-data-types custom-data-type


【解决方案1】:

您可以使用存在量化来实现:

data Sequence a = ... | forall b. UnFold b (b -> b) (b -> a)

我不确定这是否比直接存储展开结果的更简单解决方案更适合您:

data Stream a = Cons a (Stream a)
data Sequence' a = ... | Explicit (Stream a)

特别是,如果有人递给您Sequence a,您无法对其中包含的b 进行模式匹配,即使您认为自己知道它们是什么类型。

【讨论】:

  • 展开只是我想出的一个例子,看看这是否可能;如果是这样的话,你怎么能使用forall 声明呢?
  • @Vye 好的。这个答案是否满足您的需求?还是还有一些不清楚或不适合您实际使用的东西?
  • 你好。谢谢你的回答,它确实解决了这个问题,但它确实提出了另一个关于你将如何使用通用 UnFold 构造函数的问题,因为haskell(据我所知)没有明确的通用语句。
  • @Vye 例如,Unfold 0 succ id 类型检查。构建完成后,例如,您可以toList (Unfold x f e) = e x : toList (Unfold (f x) f e)
猜你喜欢
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多