我刚刚发现自己编写了一些如下代码:
import Prelude hiding (id, (.))
import Control.Category
import Control.Monad ((<=<))
-- | Intended law:
--
-- map forward . backward == id
--
data Invertible a b =
Invertible { forward :: a -> b
-- Maybe switch from [a] to Monad m => m a? (Requires RankNTypes)
, backward :: b -> [a] }
instance Category Invertible where
id = Invertible id (:[])
f . g = Invertible { forward = forward f . forward g
, backward = backward g <=< backward f
}
我曾尝试在 Google 上搜索有关 Haskell 的页面中使用术语“反向图像”或“原像”的情况,但没有运气。你们有没有人走过我现在走过的路,发现了这片土地?
我已经弄清楚这Invertible a
不是 a Functor
,因为当您尝试实现时, (no sensible function of type )fmap :: (a -> r) -> Invertible a b -> Invertible a r
没有合理的价值。但也许还有其他一些我不知道的有趣操作。backward . fmap f
(a -> r) -> (b -> [a]) -> r -> [a]