gpt4 book ai didi

python - 从 Haskell 到函数式 Python

转载 作者:太空狗 更新时间:2023-10-30 03:01:28 26 4
gpt4 key购买 nike

我想将一些 Haskell 代码翻译成 Python。Haskell 类/实例如下所示:

{-# LANGUAGE MultiParamTypeClasses #-}

module MyModule where

class Example a b where
doSomething :: a -> b -> Bool
doSomethingElse :: a -> b -> Int

instance Example Int Int where
doSomething a b = (a + b * 2) > 5
doSomethingElse a b = a - b * 4

Python 中有没有一种方法可以近似 Haskell 类/实例构造?将其翻译成 Python 的最不冒犯的方式是什么?

最佳答案

这在 Python 中并没有真正的模拟,但你可以伪造它:

def int_int_doSomething(a, b):
return (a + b * 2) > 5


def int_int_doSomethingElse(a, b):
return a - b * 4


Example = {}
Example[(int, int)] = (int_int_doSomething, int_int_doSomethingElse)


def doSomething(a, b):
types = type(a), type(b)
return Example[types][0](a, b)


def doSomethingElse(a, b):
types = type(a), type(b)
return Example[types][1](a, b)

您所要做的就是为您想要的每种类型组合向 Example 添加新值。您甚至可以在 doSomethingdoSomethingElse 中添加一些额外的错误处理,或者使用其他一些方法来简化操作。另一种方法是创建一个对象来跟踪所有这些,并允许您以更易于管理的方式向 map 添加新类型,但它只是在我已经展示的内容之上进行更多簿记。

请记住,Haskell 基本上也是这样做的,除了检查是在编译时执行的。类型类实际上只不过是对类型的字典查找,以选择适当的函数插入到计算中。 Haskell 只是在编译时自动为您完成这项工作,而不是您必须像在 Python 中那样自己管理它。


要添加簿记,您可以执行类似以下的操作,将其保存在自己的模块中,然后它只会(默认情况下)导出 __all__ 中的符号。这让事情看起来更像 Haskell 版本:

class _Example(object):
def __init__(self, doSomething, doSomethingElse):
self.doSomething = doSomething
self.doSomethingElse = doSomethingElse

ExampleStore = {}

def register(type1, type2, instance):
ExampleStore[(type1, type2)] = instance

def doSomething(a, b):
types = type(a), type(b)
return ExampleStore[types].doSomething(a, b)

def doSomethingElse(a, b):
types = type(a), type(b)
return ExampleStore[types].doSomethingElse(a, b)

def Example(type1, type2, doSomething, doSomethingElse):
register(type1, type2, _Example(doSomething, doSomethingElse))

__all__ = [
'doSomethingElse',
'doSomethingElse',
'Example'
]

然后你可以创建实例

Example(int, int,
doSomething=lambda a, b: (a + b * 2) > 5,
doSomethingElse=lambda a, b: a - b * 4
)

看起来几乎像 Haskell。

关于python - 从 Haskell 到函数式 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25293776/

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