python 3.7的带类型注释的monad实现+
typesafe-monads的Python项目详细描述
键入安全单子
这是一个在Python中构建monad的实验,由strict支持 键入批注目标是能够与 类型检查器确保其正确性。
动机
我是monads的粉丝,但相信他们在 强类型系统。我尝试过使用类似 PyMonad,但是被 缺少防止错误使用的类型约束。我本来可以 试图向其中一个库添加类型批注,但是 建立自己的更有趣。
基类
函子
地图(*
)
将函数应用于函子的内容,将其从 一件事对另一件事。
*
运算符在函子上实现映射,并且是左和
右关联:
defwordcount(s:str):returnlen(s.split())f.map(wordcount)==wordcount*f==f*wordcount
应用
扩展了Functor
纯
在应用函子中包装值
例如:
Maybe.pure("abc") == Just("abc")
Result.pure(123) == Ok(123)
应用(&
)
将实例函子中包含的值转换为 函数包装在同一类型的函子中。
&
运算符实现应用于应用程序,并且
右联想
例如:
increment=lambdax:x+1Just(3).apply(Just(increment))==Just(increment)&Just(3)==Just(4)
这可以很容易地与map结合起来应用当前的函数 多个参数:
subtract=lambdax:lambday:x-ysubtract*Just(10)&Just(4)==Just(6)
单子
扩展Applicative
。
绑定(>>
)
通过返回 同一类型的monad,允许链接多个操作
>>
运算符在单子上实现绑定,并且是左关联的
@currydeflookup(key:str,dictionary:Dict[str,str])->Maybe[str]:try:returnJust(dictionary[key])exceptKeyError:returnNothing()result=Just({"hello":"world"}).bind(lookup("hello")).bind(lambdas:s.upper())result=(Just({"hello":"world"})>>lookup("hello")>>(lambdas:s.upper()))
幺半群
映射挂起(+
)
描述类型的关联二进制操作。
mzero
为mappend
操作提供标识值。
mconcat
使用mappend
累积值列表。返回mzero
值(如果列表为空)。
单子
可能[t]
表示可选数据特定类型的Maybe
实例T
将
可以是包装该类型值的Just
对象,也可以是Nothing
- 在
Nothing
上映射函数将返回Nothing
,而不返回 调用函数 - 用
Nothing
绑定操作将返回Nothing
,而不 正在尝试操作。
结果[t,e]
表示成功或失败的状态,为每个状态声明一个类型。一个
Result
实例将是包装值为的Ok
对象
成功类型T
,或Err
对象包装
失败类型E
。
- 在
Err
上映射函数将返回Err
不变 不调用函数。 - 用
Err
绑定操作将返回Err
未更改 不尝试操作。
列表[t]
表示项的序列。
- 还实现
Monoid
。
未来[t]
表示异步操作
- 还实现
Awaitable
读卡器[T]
表示函数对其参数的应用。