gpt4 book ai didi

haskell - 在 Haskell 中实现临时多态性的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 00:09:17 26 4
gpt4 key购买 nike

我有一个多态函数,如:

convert :: (Show a) => a -> String
convert = " [label=" ++ (show a) ++ "]"

但有时我想传递给它一个 Data.Map 并做一些更花哨的键值转换。我知道我不能在这里进行模式匹配,因为 Data.Map 是一种抽象数据类型(根据 this similar SO question ),但是为此我使用 guard 没有成功,我不确定 ViewPatterns 在这里是否有帮助(并且宁愿避免它们的便携性)。

这更多是我想要的:
import qualified Data.Map as M

convert :: (Show a) => a -> String
convert a
| M.size \=0 = processMap2FancyKVString a -- Heres a Data.Map
| otherwise = " [label=" ++ (show a) ++ "]" -- Probably a string

但这不起作用,因为 M.size 除了 Data.Map 不能接受任何东西。

具体来说,我正在尝试修改 sl utility function in the Functional Graph Library为了处理 GraphViz 输出中边缘的着色和其他属性。

更新

我希望我能接受 TomMD、Antal S-Z 和 luqui 对这个问题的所有三个答案,因为他们都明白我真正在问什么。我会说:
  • Antal S-Z 提供了应用于 FGL 的最“优雅”的解决方案,但也需要最多的重写和重新思考才能在个人问题中实现。
  • TomMD 给出了一个很好的答案,在适用性与正确性方面介于 Antal S-Z 和 luqui 之间。这也是直接的,我非常感激,为什么我选择了他的答案。
  • luqui 给出了最好的“让它快速工作”的答案,我可能会在实践中使用它(因为我是一名研究生,这只是一些用于测试一些想法的一次性代码)。我不接受的原因是因为 TomMD 的回答可能会在更一般的情况下更好地帮助其他人。

  • 话虽如此,它们都是很好的答案,上述分类是一种粗略的简化。我还更新了问题标题以更好地代表我的问题(再次感谢大家拓宽了我的视野!

    最佳答案

    您刚刚解释的是您想要一个根据输入类型表现不同的函数。虽然您可以使用 data包装器,因此一直关闭函数:

    data Convertable k a = ConvMap (Map k a) | ConvOther a
    convert (ConvMap m) = ...
    convert (ConvOther o) = ...

    更好的方法是使用类型类,从而留下 convert功能开放且可扩展,同时防止用户输入无意义的组​​合(例如: ConvOther M.empty)。
    class (Show a) => Convertable a where
    convert :: a -> String

    instance Convertable (M.Map k a) where
    convert m = processMap2FancyKVString m

    newtype ConvWrapper a = CW a
    instance Convertable (ConvWrapper a) where
    convert (CW a) = " [label=" ++ (show a) ++ "]"

    通过这种方式,您可以为每种不同的数据类型使用您想要的实例,并且每次需要新的特化时,您都可以扩展 convert 的定义。只需添加另一个 instance Convertable NewDataType where ... .

    有些人可能会对 newtype 皱眉。包装器并建议一个实例,例如:
    instance Convertable a where
    convert ...

    但这将需要强烈建议不要使用重叠和不可判定的实例扩展,从而为程序员带来很少的便利。

    关于haskell - 在 Haskell 中实现临时多态性的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3944756/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com