gpt4 book ai didi

haskell - 多态返回类型、接口(interface)、回调?

转载 作者:行者123 更新时间:2023-12-02 02:50:47 25 4
gpt4 key购买 nike

假设 Goo是我的类型类,通常声称它是 C++、Java 或 C# 等语言中的接口(interface)等价物:

class Goo goo where ham :: goo -> String

data Hoo = Hoo
instance Goo Hoo where ham _ = "Hoo!"
mustard _ = "Oh oh."

data Yoo = Yoo
instance Goo Yoo where ham _ = "Yoo!"
mustard _ = "Whew"

但我无法返回 Goo :
paak :: (Goo goo) => String -> goo
paak g = (Yoo)

-- Could not deduce (goo ~ Yoo)
-- from the context (Goo goo)
-- bound by the type signature for paak :: Goo goo => String -> goo
-- at frob.hs:13:1-14
-- `goo' is a rigid type variable bound by
-- the type signature for paak :: Goo goo => String -> goo
-- at frob.hs:13:1
-- In the expression: (Yoo)
-- In an equation for `paak': paak g = (Yoo)

我发现了这个有启发性的陈述,它解释了原因:

The type paak :: (Goo goo) => String -> goo does not mean that the function might return any Goo it wants. It means that the function will return whichever Goo the user wants.



(转自 sepp2k 的回答 here )

但是,我怎样才能返回或存储满足 Goo 的东西?约束,但可以是 Hoo , Yoo , Moo , Boo或任何其他 Goo ?

我是不是太纠结于自己的编程背景,需要完全不一样的思考,比如求助于类 C 的接口(interface):
data WhewIamAGoo = WhewIamAGoo {
ham' :: String
mustard' :: String
}

paak :: String -> WhewIamAGoo
paak g = let yoo = Yoo
in WhewIamAGoo { ham' = ham yoo
mustard' = mustard ham
}

但这似乎很尴尬。

在我的具体情况下,我想使用 Goo像这样:
let x = someGoo ....
in ham x ++ mustard x

IE。调用者不需要知道所有 Yoo s 什么的。

编辑:澄清一下:我正在寻找 Haskell 程序员在这种情况下的方式。您将如何以惯用的方式处理它?

最佳答案

有两种方法可以解决这个问题,我认为这是惯用的 Haskell:

  • 代数数据类型
    data Goo = Hoo | Yoo

    ham Hoo = "Hoo!"
    ham Yoo = "Yoo!"

    mustard Hoo = "Oh oh."
    mustard Yoo = "Whew"

    优点:易于添加新操作
    缺点:添加新的“类型”可能需要修改许多现有功能
  • 支持的操作记录
    data Goo = Goo { ham :: String, mustard :: String }

    hoo = Goo { ham = "Hoo!", mustard = "Oh oh." }
    yoo = Goo { ham = "Yoo!", mustard = "Whew" }

    优点:易于添加新的“类型”
    缺点:添加新操作可能需要修改许多现有功能

  • 你当然可以混合搭配这些。一旦你习惯于考虑函数、数据和组合而不是接口(interface)、实现和继承,在大多数情况下这些就足够了。

    类型类是为重载而设计的。使用它们来模仿 Haskell 中的面向对象编程通常是错误的。

    关于haskell - 多态返回类型、接口(interface)、回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16101284/

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