[英]Is it possible in Haskell to apply the function putStrLn to every element of a list of Strings, have it print to the screen, while being non recursive
我正在尝试制作一个包含字符串列表并执行命令putStrLn
或print
的函数(我认为它们基本上是等效的,如果我错了,因为我还是Haskell的新手,请更正我)对每个元素都有打印在我的终端屏幕上。 我正在尝试使用map
函数以及lambda / anonymous函数,因为我已经知道如何递归执行此操作,但是想尝试一个更复杂的非递归版本。 map
返回的列表类型不是我想要的IO(),而我对lambda函数的尝试未按计划进行。 基本代码是:
test :: [String] -> something
test x = map (\a->putStrLn a) x -- output for this function would have to be [IO()]
不完全确定该函数的输出应该是哪个,这也给我带来了问题。
我当时正在考虑制作一个temp :: String
变量,并将每个String附加到temp上,然后将putStrLn temp
附加上,但是不确定如何完全做到这一点。 我虽然使用where
将可行的,但我还是遇到了问题。 我知道如何使用Java和C这样的语言来执行此操作,但是对于Haskell还是很陌生。 任何帮助,将不胜感激。
我当时正在考虑制作一个temp :: String变量,并将每个String附加到temp,然后放到putStrLn temp
好主意。 从长远来看,一种“呈现消息”然后一个单独的“发出消息”的模式通常很不错。
test xs = let temp = unlines (map show xs)
in putStrLn temp
要不就
test xs = putStrLn (unlines (show <$> xs))
要么
test = putStrLn . unlines . map show
不完全确定该函数的输出应该是哪个,这也给我带来了问题。
好了,您列出了IO操作的列表:
test :: [String] -> [IO ()]
test x = map (\a->putStrLn a) x
因此,有了此IO操作列表,您什么时候想要执行它们? 现在? 就一次? 第一个,其余的从来没有? 以什么顺序?
大概您想立即执行它们。 让我们也将eta (\\a -> putStrLn a)
putStrLn
因为那意味着同一件事:
test :: [String] -> IO ()
test x = sequence_ (map (\a->putStrLn a) x)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.