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 #.
Dlaczego to wymaga wyjaśnienia? Gdzie jest trudna część? –
'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. –
Czy masz rację? – dagelee