2011-09-11 58 views
2

上記のコードでは、と対話する方法は、関数をポイントフリースタイルで記述することができます。ステップバイインタラクティブなポイントフリーの方法を教えてください。

+0

まだポイントフリーではありませんか? –

+2

preludeに 'interact 'はありませんか? – delnan

+0

shortLinesOnly関数interactの@Tinctoriusはポイントフリーではありません。ポイントフリー関数は実際の引数を決して記述しません。 interact関数は結果を記述します。 –

答えて

11

ステップ:

interact r = getContents >>= putStr . r 
interact r = (getContents >>=) (putStr . r) 
interact r = (getContents >>=) $ (putStr .) $ r 
interact = (getContents >>=) . (putStr .) 
+0

JBこれは私が探していたものです!ありがとう! –

+0

ステップバイステップは本当に役立ちます。 –

6

最良の答えは:できません。この特定の例では、あなたのコードが読みにくくなるだけです。あなたの元の派手な変種は完全に上質です。

場合によっては、ポイントフリースタイルを避ける方がよい場合もあります。あなたの議論が線形のデータフローを受けないので、これもその1つです。むしろ何かのためにデータフローを構築するために使用されます。例:

-- 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) 
+1

あなたは右のポイント無料のスタイルは、この場合は読みにくいです。私はちょうどそれをする方法を知りたがっていました。 –

関連する問題