Chcę sekwencyjnie komponować dwie akcje monad w Haskell, odrzucając każdą wartość wytworzoną przez drugą i przekazując argument do obu akcji. Obecnie używam do-bloku tak:Dodaj akcję bez zmiany wyniku do notacji refactora
ask = do
result <- getLine
putStrLn result
return result
miałem nadzieję napisać trochę więcej punkt darmo i schludny, więc próbowałem to:
ask' = getLine <* putStrLn
Jednak to robi” t nawet sprawdzanie typu i problem polega na tym, że <*
nie przenosi wyniku pierwszej akcji na drugą. Chcę łączyć akcje takie jak >>=
, ale nie zmieniać wyniku. Typ powinien być następujący: (a -> m b) -> (a -> m c) -> (a -> m b)
, ale Hoogle nie daje odpowiednich wyników. Jaki byłby operator, aby osiągnąć ten skład funkcji?
Więc chcesz 'getline >> = \ x -> putStrLn x >> powrót x' w punkcie stylu wolnym. Czy zapytałeś lambdabota? Mówi 'liftM2 (>>) putStrLn return = << getLine'. –
@ ThomasM.DuBuisson Wygląda na to, że Lambdabot znalazł niemal dokładnie taką funkcję, jaką chciał OP! 'flip (liftM2 (>>)) :: Monad m => (a -> mb) -> (a -> mc) -> (a -> mb)' - rzeczywisty typ jest nieco bardziej uogólniony, więc jest nieco trudne do zobaczenia. – user2407038
@ ThomasM.DuBuisson Dziękuję, poprosiłem o narzędzie linii poleceń 'pointfree' i nie radziłem sobie z' do', więc zrezygnowałem. Skończyło się na użyciu 'ask = getLine >> = liftM2 (>>) putStrLn return', który wygląda dobrze, dzięki jeszcze raz! Możesz umieścić to w odpowiedzi, jeśli chcesz, a następnie mogę oznaczyć to jako rozwiązane. – amoebe