2

私はJavaからHaskellへの巡礼をしています。大まかに言えば、Haskell の背後にある主な概念は理解できました。すべてのチュートリアルと本を読むのは「理にかなっています」が、自分のコードをゼロから書くのに行き詰まっています。

ファイル システムに 1000 個のファイルを名前付きで作成したい

「myfile_1.txt」…「myfile_1000.txt」

それぞれにダミーテキストが含まれています。

これまでのところ、IO のすべてを解決してきましたが、文字列 1000 要素の長さのリストを作成する必要があることに気付きました。ので、私は持っています:

buildNamesList :: [] -> []
buildNamesList ???

List を取得したら、各要素で writefile メソッドを呼び出すことができます。Haskell では int i = 0, i ++ 構造を持つことができないため、文字列の末尾に数値を追加して各 fileName を取得する方法がわかりません。

私はここで私の深さから少し外れています。いくつかのガイダンスをいただければ幸いです、ありがとう

4

4 に答える 4

7

考えられる解決策の 1 つ:

buildNamesList = map buildName [1..1000]
  where buildName n = "myfile_" ++ show n ++ ".txt"
于 2013-07-08T11:15:05.473 に答える
5
import Control.Applicative

fileNames = ("myFile_"++) <$> (++".txt")  <$> show <$> [1..1000]
于 2013-07-08T11:51:10.910 に答える
2

次に、それをトラバースし、要素 n の文字列を取り出して、それを別の関数に渡すにはどうすればよいですか?

いいえ!リストから何かを「抜き取る」ことは非効率的です。各要素に到達する方法について心配したくない場合は、それを使用して何かを行います。命令型言語では、「順序付けアクション」が何を意味するかについて適切な抽象化がないため、これが必要です。これは、言語に組み込まれた魔法のようなものです。Haskell には、そのための、より明確に指定された、数学的に健全でタイプセーフな魔法があります。その結果、ループなどは必要ありません。

各要素の処理方法 ( String -> IO ()) と、データの取得元 ( ) がわかっています[String]。また、最終的にどうなるかもわかっています ( IO ())。したがって、探しているコンビネータは type を持っています( String -> IO() ) -> [String] -> IO ()が、データが文字列であることに実際には依存しないことは明らかなので、それを単純化して(a -> IO()) -> [a] -> IO(). Hoogle でそれを調べることができます。これは、スメゴミmapM_との中で提供されていますforM_。どちらもあなたが望むことをします:

mapM_ (\filename -> writeFile filename "bla") filenamesList

また

forM_ filenamesList $ \filename ->
   writeFile filename "bla"
于 2013-07-08T12:39:32.950 に答える
0

ループfoldrに似ていると思うことがあります。これは、ループ内で適用さforれる構造のようなものです。i++i

foldr (\i accum -> ("myfile_" ++ show i ++ ".txt") : accum) [] [1..1000]


zipWith別の方法として、関数を適用して 2 つのリストを結合することもできます。

zipWith (\a b -> a ++ show b ++ ".txt") (repeat "myfile_") [1..1000] 

また

zipWith ($) (repeat (("myfile_" ++) . (++ ".txt") . show)) [1..1000]


そして、これも再帰的な例で、次のように適用されfileList "myfile_" ".txt" [1..1000]ます:

fileList _     _   []     = [] 
fileList fName ext (x:xs) = (fName ++ show x ++ ext) : fileList fName ext xs
于 2013-07-08T18:12:12.160 に答える