Я просматривал некоторый код и наткнулся на следующий драгоценный камень, который, я бы поспорил, является копией-вставкой вывода pointfree
:
(Я подумал, что следующее будет более подходящим, чем обычное foo
/bar
для этого конкретного вопроса: P)
import Control.Monad (liftM2)
data Battleship = Battleship { x :: Int
, y :: Int
} deriving Show
placeBattleship :: Int -> Int -> Battleship
placeBattleship x' y' = Battleship { x = x', y = y' }
coordinates :: Battleship -> (Int, Int)
coordinates = liftM2 (,) x y
Кто-нибудь будет достаточно любезен, чтобы объяснить шаги, необходимые для упрощения от:
(i) coordinates b = (x b, y b)
до:
(ii) coordinates = liftM2 (,) x y
?
В частности, меня немного смущает использование liftM2
, поскольку я даже не знал, что на заднем плане скрывается монада.
Я знаю, что (i) также может быть представлено как: coordinates s = (,) (x s) (y s)
, но я не уверен, где и как действовать дальше.
P.S. Вот почему я подозреваю, что это от pointfree
(вывод от GHCI
, а :pl
имеет псевдоним pointfree
):
λ: :pl coordinates s = (x s, y s)
coordinates = liftM2 (,) x y