Scala 可以在Haskell中提供自定义模式分解吗?

Scala 可以在Haskell中提供自定义模式分解吗?,scala,haskell,pattern-matching,type-constructor,Scala,Haskell,Pattern Matching,Type Constructor,在Haskell中,我有一个偏序类型的模块: data PartialOrder a = PartialOrder [a] [(a, a)] 我不导出值构造函数,因为这不是我希望使用类型的方式,但我仍然希望能够在模块外部模式匹配PartialOrder类型;这可能吗?特别是,我希望能够对不是类型构造函数的内容进行模式匹配,而是对以下内容进行模式匹配: f (PartialOrder xs le) = ... 其中,le是一个隐式定义值构造函数中定义的显式顺序的函数。我知道Scala有这样的设

在Haskell中,我有一个偏序类型的模块:

data PartialOrder a = PartialOrder [a] [(a, a)]
我不导出值构造函数,因为这不是我希望使用类型的方式,但我仍然希望能够在模块外部模式匹配PartialOrder类型;这可能吗?特别是,我希望能够对不是类型构造函数的内容进行模式匹配,而是对以下内容进行模式匹配:

f (PartialOrder xs le) = ...
其中,
le
是一个隐式定义值构造函数中定义的显式顺序的函数。我知道Scala有这样的设施,有没有办法在Haskell做到这一点


提前感谢。

这听起来像是
视图模式的一个用例。您可以编写如下类型:

data ViewPartialOrder a = ViewPartialOrder a (a -> a -> Ordering)
编写如下函数:

viewOrder :: PartialOrder -> ViewPartialOrder
viewOrder (PartialOrder xs relation) = ...
然后使用
ViewPatterns
扩展来编写如下代码:

f (viewOrder -> ViewPartialOrder xs le) = ...
当然,你应该给这些东西起个更好的名字:p


无论好坏,都无法隐式地产生相同的效果(即没有
viewOrder
函数)。我认为这通常是一件好事,清楚地表明您与类型的实际实现不匹配。

使用视图模式的建议很好,但是您可以通过与“视图”预合成(毕竟,它只是一个函数)而不使用视图模式来获得大致相同的效果

如此给定

viewOfPartialOrder :: PartialOrder -> ViewPartialOrder
viewOfPartialOrder (PartialOrder xs relation) = ...
正如Tikhon Jelvis(用一个稍微不同的名字)所建议的,而不是

doSomethingWithAPartialOrder :: PartialOrder a -> Whatever
doSomethingWithAPartialOrder (viewOfPartialOrder -> ViewPartialOrder xs le) = ...
你可以定义

doSomethingWithAView :: ViewPartialOrder a -> Whatever
doSomethingWithAView (ViewPartialOrder xs le) = ...

doSomethingWithAPartialOrder :: PartialOrder a -> Whatever
doSomethingWithAPartialOrder = doSomethingWithAView . viewOfPartialOrder

就我个人而言,我发现编辑以后一种方式呈现的代码更容易,但你应该选择你个人喜欢的任何东西。

@ChrisTaylor:好的老式“西方最快的枪问题”:p.新的扩展模式同义词将提供你想要的,但目前还没有完全可用。