我正在考虑学习Haskell来完成一些特定的任务。我想做幺半产品:
假设f:A -> B
和g: C -> D
是函数,我想做一个幺半积:
f * g : A * C -> B * D
这在哈斯克尔中很容易实现吗?如果是这样,你能举一个简单的例子吗?
Haskell将笛卡尔乘积类型(你的*
(拼写为(,)
,如(Int, Bool)
。手动构造产品态射不需要大量代码:
prod :: (a -> b, c -> d) -> (a, c) -> (b, d)
prod (f, g) (x, y) = (f x, g y)
prod
的柯里版本,带有一种(a -> b) -> (c -> d) -> (a, c) -> (b, d)
,可以在base
中找到,名称为Control.Arrow.(***)
或Data.Bifunctor.bimap
。这些功能中的每一个实际上都是重载的,因此它们适用于多种类型,而不仅仅是产品,例如bimap :: (a -> b) -> (c -> d) -> Either a c -> Either b d
.