如何使交互点免费?

时间:2011-09-11 12:41:52

标签: haskell pointfree

shortLinesOnly :: IO ()
shortLinesOnly = interact result
    where
        shortLength     = 11
        onlyShorts      = (<= shortLength) . length
        shortLines      = filter onlyShorts . lines
        result          = unlines . shortLines
        interact result = getContents >>= putStr . result

在上面的代码中,我如何以无点样式编写 interact 函数。

2 个答案:

答案 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)