在Haskell中创建字符串列表

时间:2013-07-08 11:10:08

标签: haskell

我正在从Java到Haskell朝圣。从广义上讲,我得到了Haskell背后的主要概念。阅读所有教程和书籍'有意义'但是我从头开始编写自己的代码了。

我想在名称为

的文件系统上创建1000个文件

" myfile_1.txt" ..." myfile_1000.txt"

并且每个都包含一些虚拟文本。

到目前为止,我已经完成了整个IO的事情,并意识到我需要构建一个长度为1000的字符串列表。所以我有:

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

一旦我有了List,我就可以在每个元素上调用writefile方法。我能弄清楚的是如何在String的末尾添加一个数字来获取每个fileName,因为我在Haskell中不能有一个int i = 0,i ++构造。

我有点超出我的深度,会感谢一些指导,谢谢

4 个答案:

答案 0 :(得分:7)

一种可能的解决方案:

buildNamesList = map buildName [1..1000]
  where buildName n = "myfile_" ++ show n ++ ".txt"

答案 1 :(得分:5)

import Control.Applicative

fileNames = ("myFile_"++) <$> (++".txt")  <$> show <$> [1..1000]

答案 2 :(得分:2)

  

然后如何遍历它,在元素n处取出String然后将其传递给另一个函数?

没有!从列表中“抽出”效率低下的东西。你不想担心如何获得每个元素,然后用它做一些事情。这在命令式语言中是必要的,因为它们没有对“排序动作”的含义进行适当的抽象 - 它只是语言内置的神奇内容。哈斯克尔有much more well-specified, mathematically sound and type-safe magic for that;因此,你不需要循环等。

您知道如何处理每个元素(String -> IO ()),并且知道数据的来源([String])。你也知道最终会发生什么(IO ())。所以您正在寻找的组合器具有类型( String -> IO() ) -> [String] -> IO (),但显然它并不真正依赖于数据是字符串,所以让我们将其简化为(a -> IO()) -> [a] -> IO()。你可以look that up on Hoogle提供sume垃圾mapM_forM_,它们都可以满足您的需求:

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

forM_ filenamesList $ \filename ->
   writeFile filename "bla"

答案 3 :(得分:0)

有时我认为foldrfor循环有一些相似之处。这有点像i++构造,在循环中应用i

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


另一种方式可能是zipWith,它应用一个函数来组合两个列表:

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