, daha düzenli bir tanımı sağlar:
kütüphane destek olarak
wfmap :: Functor f => (a -> b) -> (b -> a) -> (b -> f b) -> a -> f a
wfmap u w g = fmap w . g . u
, merceknifty support for isomorphisms içerir. Biraz daha geniş, Gurkenglas notları olarak ...
Functor f => (b -> f b) -> a -> f a
da Lens' a b
denilen ve lens kütüphanede merkezini oluşturur edilir. Hatta
wfmap :: Functor f => (a -> b) -> (b -> a) -> (b -> f b) -> a -> f a
wfmap u w g = (iso u w) g
Veya:: En fonksiyonu olarak tanımlanabilir olabileceğini çalıştığını, neden bir sonucudur nasıl ve ayrıntıları dalmadan olmadan
wfmap :: Functor f => (a -> b) -> (b -> a) -> (b -> f b) -> a -> f a
wfmap = iso
wfmap
adildir (iso
'un özel bir versiyonu olup, b -> f b
isomorphism "destination" üzerindeki bir a -> f a
fonksiyonuna dönüştürmek için kullanılabilecek bir fonksiyon sunar. izomorfizm "kaynak".
Aynı zamanda bir eşbiçimlilik diğer tarafında fmap
uygulanması biraz farklı bir amaç için kullanılabilecek mapping
, söz etmek gerekiyor: Son olarak
GHCi> :t \u w g -> over (mapping (iso u w)) (fmap g)
\u w g -> over (mapping (iso u w)) (fmap g)
:: Functor f => (s -> a) -> (b -> t) -> (a -> b) -> f s -> f t
GHCi> :t \u w g -> under (mapping (iso u w)) (fmap g)
\u w g -> under (mapping (iso u w)) (fmap g)
:: Functor f => (s -> a) -> (b -> a1) -> (a1 -> s) -> f b -> f a
, iso u w
herhangi Iso
ile değiştirilebilir unutmayın sen kütüphanelerde bulunabilir veya başka yerlerde önceden tanımlanmış olabilir.
Son argüman olarak 'x :: a' almak daha mantıklı olmaz mıydı? – leftaroundabout
@leftaroundabout oh evet, öyle. Bunu işaret ettiğin için teşekkürler. Ama bu benim sorunumu açıklamak için sadece bir sözde kod. Onun sadece ben buna benzer bir desen kullanan birçok fonksiyona ve türe sahip olduğumu ve bunu yapmak için daha iyi bir yol olup olmadığını merak ediyorum. – iluvAS
'wfmap' türünüzde 5 argüman, ancak tanımda sadece 4'ü beyan ediyor. Bence türünde sadece a türünde bir argüman var. – chepner