gpt4 book ai didi

haskell - Haskell 中的 OCaml 模块的等价物是什么?

转载 作者:行者123 更新时间:2023-12-04 03:37:25 25 4
gpt4 key购买 nike

我看到的大多数 Haskell 代码都使用了直接结构,例如列表和树。例如,Haskeller 通常会这样写:

fillRect :: Color → Bounds → Image → Image

这种模式有一个问题:如果后来程序员决定修改“Image”的定义,或者使用另一个数据结构,那么他将不得不 使用它重构每一段代码 .在 OCaml 中,您可以简单地使用一个模块来指定 Image 的接口(interface),然后再决定具体的实现。

什么是 OCaml 模块的 Haskell 替代品?

最佳答案

有几种选择;没有一个与 ML 模块完全匹配,但每个方面都匹配。

  • 参数多态性。而不是参数化你的模块和fillRectImage 上的函数, 你参数化摘要 Image指定图像的特定“种类”的东西的类型构造函数。所以这将是一个签名

    fillRect_ppm :: ImageImplemetation i => Colour -> Bounds -> Image i -> Image i

    在哪里 ImageImplemetation是一些类型类,它指定了转换和/或后端函数之类的东西。
    有了这样的解决方案,您无法真正替换 Image类型完全,但您可以使类型本身任意灵活。很可能,您将用于 Image 的所有具体类型实际上会共享一些字段,所以最好不要让它比必要的更灵活:ImageImplemetation 的不同实例只需要实现它们之间的不同之处。如果实现非常相似,也许您只想对颜色空间等一些细节进行参数化。
    当然,你需要提前计划好这个解决方案,但只是为了一个通用的接口(interface)。如果您定义了必要的实例,您仍然可以稍后将任何类型作为参数。
  • 类似地(并且可以混合),您可以只为可以保存图像数据的类型提供一个类型类。

    fillRect_tcl :: Image img => Colour -> Bounds -> img -> img
    Image类会直接定义一些原语,比如如何画线,fillRect_tcl将在其实现中使用这些。很好,因为 fillRect_tcl立即适用于任何此类类型。有点糟糕的是 Image类将需要相当大(最好将类型类用于具有简单且非常明确的规律的“数学”内容)。
  • 也许该类甚至可以将矩形作为一种方法:

    class Image img where
    ...
    fillRect_tcm :: Colour -> Bounds -> img -> img
    ...

    不太好,您需要为任何 img 完全重新定义该方法实例。
  • Haskell 的模块系统不能做很多事情,但有时它仍然足以让您免于重构所有内容。例如,如果 Image来自一个模块Data.Image ,你可以做到

    import qualified Data.Image as IM

    fillRect_qfi :: Colour -> Bounds -> IM.Image -> IM.Image

    并使用该模块中定义的所有函数,也通过限定符。如果在某个时候您决定切换实现,您只需更改导入即可。
    当然,这对于定期在类型之间切换不是很好,但对于一次性更改来说还不错。

  • 非常适合您的示例: diagrams使用前两个点;例如 rect使用 TrailLike类来实现其原语,并且该类包括“最终”图表类型 QDiagram ,在您将用于渲染的后端参数化。

    关于haskell - Haskell 中的 OCaml 模块的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26247031/

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