2016-12-03 13 views
6

Haskell'in Prelüdünde böyle bir şey var mı? Üzerinde çalıştığım bir projede Haskell'de İzomorfik fomp

wfmap :: Functor f 
     => a 
     -> (a -> b) 
     -> (b -> a) 
     -> (b -> f b) 
     -> f a 
wfmap x u w g = fmap (w) (g (u x)) 

, sık sık kendimi, süreci ve 'dönüştürme' geri başka bir türü 'dönüştürme' bulunamadı. leftaroundabout anlaşılacağı gibi bağımsız değişkenler yeniden sıralama

+0

Son argüman olarak 'x :: a' almak daha mantıklı olmaz mıydı? – leftaroundabout

+0

@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

+2

'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

cevap

7

, 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.

+0

Bunun için teşekkürler! :) – iluvAS