我正在考虑学习Haskell来完成一些特定的任务。我想做monoidal产品:
假设f:A -> B
和g: C -> D
是函数,我想做一个monoidal产品:
f * g : A * C -> B * D
这在Haskell中是否可以轻松实现?如果是这样,你能给出一个简单的例子吗?
答案 0 :(得分:5)
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)
,可在名称Control.Arrow.(***)
或Data.Bifunctor.bimap
下的base
中找到。这些功能中的每一个实际上都是重载的,因此它们可以用于各种类型,而不仅仅是产品,例如bimap :: (a -> b) -> (c -> d) -> Either a c -> Either b d
。