【问题标题】:How to represent a parameterized type in Python?如何在 Python 中表示参数化类型?
【发布时间】:2019-04-06 18:28:11
【问题描述】:

在 Haskell 中,foldmfoldl 的 monad 版本)具有这种类型。

foldM :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a

(例如,参见this。)

可以像这样声明一个 Python 等价物。

a = TypeVar('a')
b = TypeVar('b')
def foldM(f: Callable[[a, b], Monad], acc: a, xs: List[b]) -> Monad:
    ...

这样做的一个问题是它没有将Monad 显示为由类型a 参数化。我想写Monad[a],但那是无效的。有没有办法做到这一点?

【问题讨论】:

标签: python haskell python-typing


【解决方案1】:

Monad 继承自Generic

from typing import TypeVar, List, Callable, Generic

a = TypeVar('a')
b = TypeVar('b')

class Monad(Generic[a]):
    # your code here
    pass

def foldM(f: Callable[[a, b], Monad[a]], acc: a, xs: List[b]) -> Monad[a]:
    # your code here
    pass

【讨论】:

  • 谢谢。问题是 Monad 是在库中定义的,而不是我的代码。 (我应该在问题中提到这一点。)
  • @RussAbbott 您可能必须为Monad 定义自己的类型提示代理,就像typing[](和其他类似列表的类型)提供List
  • @chepner,你有什么建议吗?
  • class MonadType(Generic[a]): pass 可能就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2011-01-01
相关资源
最近更新 更多