Как мне сделать взаимодействие без очков? - PullRequest
2 голосов
/ 11 сентября 2011
shortLinesOnly :: IO ()
shortLinesOnly = interact result
    where
        shortLength     = 11
        onlyShorts      = (<= shortLength) . length
        shortLines      = filter onlyShorts . lines
        result          = unlines . shortLines
        interact result = getContents >>= putStr . result

В приведенном выше коде, как я могу написать функцию взаимодействовать в стиле без точек.

Ответы [ 2 ]

11 голосов
/ 11 сентября 2011

Шаг за шагом:

interact r = getContents >>= putStr . r
interact r = (getContents >>=) (putStr . r)
interact r = (getContents >>=) $ (putStr .) $ r
interact = (getContents >>=) . (putStr .)
6 голосов
/ 11 сентября 2011

Лучший ответ: не надо. В этом конкретном примере единственным изменением будет то, что ваш код будет менее читабельным. Ваш оригинальный заостренный вариант прекрасно подойдет.

В некоторых случаях лучше избегать стиля без очков. Это один из них, потому что ваш аргумент не подвергается линейному потоку данных. Он скорее используется для создания потока данных для чего-то другого. Пример:

-- Bad: Pointy linear data flow description.
chunksOf :: Int -> [a] -> [[a]]
chunksOf n xs =
    takeWhile (not . null) (map (take n) (iterate (drop n) xs))

-- Good: Pointfree linear data flow description.
chunksOf :: Int -> [a] -> [[a]]
chunksOf n =
    takeWhile (not . null) . map (take n) . iterate (drop n)

-- Bad: Now exaggerating with pointfree style.
chunksOf :: Int -> [a] -> [[a]]
chunksOf =
    liftA2 ((.) (.) . (.) $ takeWhile (not . null))
           (map . take)
           (iterate . drop)
...