繁体   English   中英

在Haskell中创建字符串列表

[英]Create List of Strings in Haskell

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

我想在文件系统上创建1000个带有名称的文件

“myfile_1.txt”...“myfile_1000.txt”

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

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

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

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

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

一种可能的方案:

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

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

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

没有! 从列表中“抽出”效率低下的东西。 你不想担心如何获得每个元素,然后用它做一些事情。 这在命令式语言中是必要的,因为它们没有对“排序动作”的含义进行适当的抽象 - 它只是语言内置的神奇内容。 Haskell有更明确的,数学上合理的声音和类型安全的魔力 ; 因此,你不需要循环等。

您知道如何处理每个元素( String -> IO () ),并且您知道数据来自何处( [String] )。 你也知道最终应该发生什么( IO () )。 所以你正在寻找的组合器有类型( String -> IO() ) -> [String] -> IO () ,但显然它并不真正依赖于数据是字符串,所以让我们简化为(a -> IO()) -> [a] -> IO() 你可以在Hoogle上查看 ,它提供mapM_垃圾mapM_forM_ ,两者都可以做你想要的:

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

要么

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

有时我认为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM