不必要に命令的な方法でプログラミングすることで、生活を困難にしています。あなたは美しい Haskell 言語でプログラミングしていて、goto構文を探しています!
だけでなくimport Control.Applicative (<$>)、書いてみませんか
readAndChange' = writeFile "couples.txt" =<<
unlines.map (show.extractNameAndId).lines <$> readFile "deletedId.csv"
(そうです、これはほぼワンライナーです。クリーンで機能的なスタイルであり、行の読み取りと書き込みのメカニズムによって整理されています。処理は可能な限り純粋なコードで行われ、入力と出力のみが IO ベースです。)
説明:
ここでunlines.map (show.extractNameAndId).linesは、入力を行に切り刻み、 を使用してそれぞれに適用しextractNameAndId、で再度結合して処理します。showmapunlines
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 は優れたリソースです。StringIO StringMaybe Stringsomeone :: 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