Haskell 中的通用模式
Generic Pattern in Haskell
我希望 Haskell 的编译器能够理解 f v
是类型安全的 Unfold v f
(尽管这是一项艰巨的任务)。
data Sequence a = FirstThen a (Sequence a) | Repeating a | UnFold b (b -> b) (b -> a)
有什么方法可以在不添加额外模板参数的情况下封装数据类型的通用模式。
(我知道使用惰性地图的这种特定情况的解决方案,但我正在寻求更通用的解决方案)
您可以使用存在量化来实现:
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
进行模式匹配,即使您认为您知道它们是什么类型。
我希望 Haskell 的编译器能够理解 f v
是类型安全的 Unfold v f
(尽管这是一项艰巨的任务)。
data Sequence a = FirstThen a (Sequence a) | Repeating a | UnFold b (b -> b) (b -> a)
有什么方法可以在不添加额外模板参数的情况下封装数据类型的通用模式。
(我知道使用惰性地图的这种特定情况的解决方案,但我正在寻求更通用的解决方案)
您可以使用存在量化来实现:
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
进行模式匹配,即使您认为您知道它们是什么类型。