shortLinesOnly :: IO ()
shortLinesOnly = interact result
where
shortLength = 11
onlyShorts = (<= shortLength) . length
shortLines = filter onlyShorts . lines
result = unlines . shortLines
interact result = getContents >>= putStr . result
在上面的代码中,我如何以无点样式编写 interact 函数。
答案 0 :(得分:11)
一步一步:
interact r = getContents >>= putStr . r
interact r = (getContents >>=) (putStr . r)
interact r = (getContents >>=) $ (putStr .) $ r
interact = (getContents >>=) . (putStr .)
答案 1 :(得分:6)
最好的答案是:不要。对于这个特定的例子,唯一的变化是你的代码可读性较差。你原来的尖头变种非常好。
在某些情况下,最好避免使用无点样式。这是其中之一,因为您的参数不会经历线性数据流。它更适用于为其他东西构建数据流。例如:
-- 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)