不必要に命令的な方法でプログラミングすることで、生活を困難にしています。あなたは美しい Haskell 言語でプログラミングしていて、goto
構文を探しています!
だけでなくimport Control.Applicative (<$>)
、書いてみませんか
readAndChange' = writeFile "couples.txt" =<<
unlines.map (show.extractNameAndId).lines <$> readFile "deletedId.csv"
(そうです、これはほぼワンライナーです。クリーンで機能的なスタイルであり、行の読み取りと書き込みのメカニズムによって整理されています。処理は可能な限り純粋なコードで行われ、入力と出力のみが IO ベースです。)
説明:
ここでunlines.map (show.extractNameAndId).lines
は、入力を行に切り刻み、 を使用してそれぞれに適用しextractNameAndId
、で再度結合して処理します。show
map
unlines
unlines.map (show.extractNameAndId).lines <$> readFile "deletedId.csv"
ファイルを読み取り、処理関数を適用します。<$>
のための楽しい構文ですfmap
。
writeFile "couples.txt" =<< getanswer
と同じですgetanswer >>= writeFile "couples.txt"
- 上記のように答えを得て、それをファイルに書き込みます。
書いてみてgreet xs = "hello " ++ xs
から、ghciでこれらを楽しみましょう
greet "Jane" -- apply your pure function purely
greet $ "Jane" -- apply it purely again
greet <$> ["Jane","Craig","Brian"] -- apply your function on something that produces three names
greet <$> Just "Jane" -- apply your function on something that might have a name
greet <$> Nothing -- apply your function on something that might have a name
greet <$> getLine -- apply your function to whatever you type in
greet <$> readFile "deletedId.csv" -- apply your function to your file
最後の 1 つは、 での使用方法<$>
ですreadAndChange
。deletedId.csv に大量のデータがある場合、hello を見逃すことになりますが、もちろんできます。
greet <$> readFile "deletedId.csv" >>= writeFile "hi.txt"
take 4.lines <$> readFile "hi.txt"
最初の 4 行を表示します。
したがって$
、指定した引数で関数を使用できます。greet :: String -> String
したがって、 と書く場合greet $ person
、person
は 型String
である必要がありますが、 と書く場合greet <$> someone
、は文字列のリスト、 、をsomeone
生成するものであれば何でもかまいません。技術的には ですが、最初に型クラスと Applicative Functor を読む必要があります。Learn You a Haskell for Great Good は優れたリソースです。String
IO String
Maybe String
someone :: Applicative f => f String
さらに面白いことに、複数の引数を持つ関数がある場合でも、素敵な Applicative スタイルを使用できます。
insult :: String -> String -> String
insult a b = a ++ ", you're almost as ugly as " ++ b
試す
insult "Fred" "Barney"
insult "Fred" $ "Barney"
insult <$> ["Fred","Barney"] <*> ["Wilma","Betty"]
insult <$> Just "Fred" <*> Nothing
insult <$> Just "Fred" <*> Just "Wilma"
insult <$> readFile "someone.txt" <*> readFile "someoneElse.txt"
ここでは<$>
、関数の後、<*>
必要な引数の間に使用します。それがどのように機能するかは、最初は少し戸惑いますが、効果的な計算を記述する最も機能的なスタイルです。
次に Applicative Functor について読んでください。彼らは素晴らしいです。
http://learnyouahaskell.com/functors-applicative-functors-and-monoids
http://en.wikibooks.org/wiki/Haskell/Applicative_Functors