2016-08-17 23 views
13

Ben Bartosz müthiş blog okuma ve meydan okuma söz 3 birlikte takip ediyorum, biraz stumped için:Doğal Dönüşümler Okuyucu Bool itibaren Belki

https://bartoszmilewski.com/2015/04/07/natural-transformations/

S3: tanımlamak bazı doğal dönüşümler gelen

newtype Reader e a = Reader (e->a) 

runReader :: Reader e a -> e -> a 
runReader (Reader f) env = f env 

instance Functor (Reader e) where 
    fmap f (Reader g) = Reader (\x -> f (g x)) 
: Reader BoolMaybe

I olarak Okuyucu functor tanımladınız

ve ben

n :: Reader Bool a -> Maybe a 

Sezgim Reader 'ın çevre True ise, bir Just a sahip olmasıdır doğal dönüşümü bulmak istiyoruz ve Nothing için False, o zaman doğal dönüşüm projeleri. Ama bu biraz monadik hissediyor, ya da Reader Bool (Maybe Int) gibi Reader iç içe bir Maybe gibi, emin değilim.

Bunu nasıl yapacağımı bilemiyorum.

n :: Reader Bool a -> Maybe a 
n (Reader f) = Just (f True) 

Ama bu ortam dikkate almak, ne de Nothing döndüremez: Ben en iyisi.

fmap'dan bir kare oluşturmak ve doğal dönüşümler oluşturmak için bir yapı oluşturmak istiyorum. ex

:

      nat 
Reader Bool Int +---------------------------> Maybe Int 
    +           + 
    |           | 
    |           | 
    |           | 
    | fmap show        | fmap show 
    |           | 
    |           | 
    |           | 
    |           | 
    v     nat      v 
Reader Bool String +--------------------------> Maybe String       

beni boşlukları doldurmak yardımcı olabiliriz? Bir yorumda daha önce söylediğim gibi, çevreyi kullanmak istersiniz, ancak, yalnızca Reader'ınız olduğundan, hiçbir ortam yoktur ve bunu kendiniz sağlamanız gerekir.

+2

Çevreyi kullanmak istemezsiniz, ancak, yalnızca Reader'ınız olduğundan, hiçbir ortam yoktur ve bunu kendiniz sağlamanız gerekir. Ben sadece (f Gerçek), “Sadece (f Yanlış)” ve “Hiçbir şeyin” bu bisikletçiler arasındaki tüm doğal dönüşümler olduğunu hissediyorum. – lisyarus

cevap

19

n (Reader f) = Just (f True) 

n (Reader f) = Just (f False) 

n (Reader f) = Nothing 

en fazla vardır ispatlayalım:

Açıkça, bu aslında üç ayrı doğal dönüşümler Reader Bool a -> Maybe a vardır. Kategori-kuramsal terimlerle, Reader Bool a funktörü sadece Hom(Bool,_)'dur. Şimdi, Yoneda lemma olduğunu

Nat(Hom(X,_), F) = F(X) 

, bir functor F için funktor Hom(X,_) doğal dönüşümler seti F(X) unsurları ile bire bir tekabül etmektedir söyler. Just True, Just False ve Nothing, cevap başında uygulamalarına karşılık gelir:

Bizim durumumuzda

, X = Bool ve F = Maybe, bu yüzden

Nat(Hom(Bool,_),Maybe) = Maybe Bool 

Maybe Bool tam üç öğeleri içerir elde ederiz.

+0

Bu mantıklı! Yani, sadece 3 olası nat var. Reader Bool ve 'Belki' arasındaki dönüşümler, doğru mu? Daha sonra # 2 numaralı soru üzerine, Reader() 'dan' List''e doğal dönüşümler sorar. Ben geldim: 'n (Reader f) = [f()]' ve sonsuz n '(Reader f) = [() ...()]'. Bu doğru mu? –

+1

@ Josh.F, 'Reader()', “Identity” için ahlaki olarak isomorftur. Yani bir element al ve bir liste yapman gerekiyor. Böylece her doğal sayı için bir doğal dönüşüm (0 unutma), artı sonsuz bir tane vardır. Bence. – dfeuer

+2

@dfeuer Tam olarak! Ve Yoneda aynı şeyi verir: Doğal dönüşümler 'Reader() -> Liste '' List() '' e karşılık gelir. – lisyarus