Według pointfree
:Co to jest wyprowadzenie, które pokazuje, że Haskell x -> (x, x) odpowiada złączeniu (,)?
\x -> (x, x)
odpowiada:
join (,)
Jakie jest pochodzenie, który pokazuje to?
Według pointfree
:Co to jest wyprowadzenie, które pokazuje, że Haskell x -> (x, x) odpowiada złączeniu (,)?
\x -> (x, x)
odpowiada:
join (,)
Jakie jest pochodzenie, który pokazuje to?
Spójrz na podpisami typu:
\x -> (x, x) :: a -> (a, a)
(,) :: a -> b -> (a, b)
join :: Monad m => m (m a) -> m a
Należy zauważyć, że ((->) r)
jest instancją Monad
typeclass. Stąd na specjalizujący:
join :: (r -> r -> a) -> (r -> a)
Co join
robi dla funkcji jest zastosowanie danej funkcji dwa razy do tego samego argumentu:
join f x = f x x
-- or
join f = \x -> f x x
od tego, widzimy trywialnie:
join (,) = \x -> (,) x x
-- or
join (,) = \x -> (x, x)
Co było do okazania.
Uwielbiam intuicyjną odpowiedź Aadits. Oto, jak to wymyśliłem, czytając kod źródłowy.
join
join
join
join x = x >>= id
join (,) = (,) >>= id
>>=
on Hoogle and click the link(,)
która jest funkcją, więc click "source" on the Monad ((->) r)
instancef >>= k = \r -> k (f r) r
f = (,)
i k = id
, otrzymujemy \r -> id ((,) r) r
id
! I sprawdzić, że na Hoogle i click through to its source codeid x = x
join (,)
mamy teraz \r -> ((,) r) r
\r -> (,) r r
\r -> (r,r)
Nigdy nie zapominaj, że plamki łączą się z kodem źródłowym biblioteki. Jest to niezmiernie przydatne, gdy próbujemy zrozumieć, jak działają razem.
To jest piękne dla początkujących.Pisanie takich odpowiedzi jest niezmiernie przydatne dla nowych osób. –