[英]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"
有时我认为foldr
与for
循环有一些相似之处。 这里有点像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.