7

次のようなコードを書いていることに気づきました。

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
                       }

Haskell に関するページで「逆イメージ」または「プリイメージ」という用語の使用を Google で検索してみましたが、うまくいきませんでした。私が今踏んでいる道を踏んで、土地の配置を発見した人はいますか?

実装しようとすると、 (タイプの実用的な関数がない)の実用的な値がないため、 でInvertible aはないことはすでにわかっています。しかし、私が気付いていない他の興味深い操作があるかもしれません。Functorfmap :: (a -> r) -> Invertible a b -> Invertible a rbackward . fmap f(a -> r) -> (b -> [a]) -> r -> [a]

4

0 に答える 0