【问题标题】:Is it possible to provide a custom pattern decomposition in Haskell?是否可以在 Haskell 中提供自定义模式分解?
【发布时间】:2013-12-21 12:47:19
【问题描述】:

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

data PartialOrder a = PartialOrder [a] [(a, a)]

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

f (PartialOrder xs le) = ...

其中le 是一个隐式定义值构造函数中定义的显式排序的函数。我知道 Scala 中有这样的工具,有没有办法在 Haskell 中做同样的事情?

提前致谢。

【问题讨论】:

    标签: scala haskell pattern-matching type-constructor


    【解决方案1】:

    这听起来像是ViewPatterns 的用例。您可以编写如下类型:

    data ViewPartialOrder a = ViewPartialOrder a (a -> a -> Ordering)
    

    编写如下函数:

    viewOrder :: PartialOrder -> ViewPartialOrder
    viewOrder (PartialOrder xs relation) = ...
    

    然后使用ViewPatterns 扩展来编写如下代码:

    f (viewOrder -> ViewPartialOrder xs le) = ...
    

    当然,你应该为这些东西想出更好的名字:P!

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

    【讨论】:

    • @ChrisTaylor:老式的“西部最快的枪问题”:P.
    • 新的扩展 PatternSynonyms 将提供你想要的,但它还不完全可用。
    【解决方案2】:

    使用视图模式的建议很好,但您可以在没有视图模式的情况下通过预先组合“视图”来获得大致相同的效果,毕竟它只是一个函数。

    给定

    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
    

    我个人觉得后一种方式更容易编辑代码,但你应该选择你个人喜欢的任何方式。

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      • 2013-10-14
      • 1970-01-01
      相关资源
      最近更新 更多