2013-09-02 15 views
7

Oto Explanation of Monad laws w Haskell.Wyjaśnienie praw Monady w F #

Jak wyjaśnić prawa Monada w F #?

  1. wiążą (m, powrót) jest równa M.

  2. wiążą ((powrót x), M) jest równa f x.

  3. wiązanie (wiązanie (m, f), g) jest równoważne wiązaniu (m, (zabawa x -> wiązanie (f x, g))).

+3

Dlaczego to wymaga wyjaśnienia? Gdzie jest trudna część? –

+0

'bind (M, return)' nie jest dokładnie 'M', pamiętaj, że F # jest zanieczyszczone, więc wiązanie może powodować efekty uboczne i mutacje. –

+0

Czy masz rację? – dagelee

Odpowiedz

10

Myślę, że dobrym sposobem na ich zrozumienie w F # jest spojrzenie na to, co rozumiemy za pomocą składni wyrażeń obliczeniowych. Napisam m dla jakiegoś programu do tworzenia obliczeń, ale możesz sobie wyobrazić, że jest to async lub inny typ obliczeniowy.

Lewy tożsamość

m { let! x' = m { return x } = m { let x' = x 
    return! f x' }      return! f x' } 

Prawy tożsamość

m { let! x = comp    = m { return! comp } 
    return x } 

Łączność

m { let! x = comp    = m { let! y = m { let! x = comp 
    let! y = f x         return! f x } 
    return! g y }      return! g y } 

prawa zasadniczo mówią, że powinieneś być w stanie zmienić jedną wersję programu na drugą bez zmiany znaczenia - tak, jak możesz refaktoryzować zwykłe programy F #.

+2

Przykład asocjatywności jest nieco mylący: co stało się z 'g' w prawym przykładzie kodu? Jeśli ostatnia linia to 'return! g y'? –

+1

@ChristopherStevenson Naprawienie tej literówki zajęło mi tylko 4,5 roku! –