在Haskell中是否可以将putStrLn函数应用于字符串列表的每个元素,使其打印到屏幕上,而无需递归

the*_*One 0 string io haskell list

我正在尝试制作一个包含字符串列表并执行命令的函数,putStrLn或者print将其打印到每个元素((我认为它们基本上是等效的,如果我错了,因为我还是Haskell的新手,请更正我))并打印出来在我的终端屏幕上。我正在尝试该map函数以及lambda /匿名函数,因为我已经知道如何递归执行此操作,但是想尝试一个更复杂的非递归版本。map返回了IO()类型的列表,这不是我想要的,并且我对lambda函数的尝试未按计划进行。基本代码是:

test :: [String] -> something
test x = map (\a->putStrLn a) x -- output for this function would have to be [IO()]
Run Code Online (Sandbox Code Playgroud)

不完全确定该函数的输出应该是哪个,这也给我带来了问题。

我当时正在考虑制作一个temp :: String变量,并将每个String附加到temp,然后putStrLn temp不确定如何完全做到这一点。我虽然可以使用where,但仍然遇到问题。我知道如何使用Java和C这样的语言来执行此操作,但是对于Haskell还是很陌生。任何帮助,将不胜感激。

Fyo*_*kin 5

有一个特殊的版本map可以与monadic函数一起使用,称为mapM

test :: [String] -> IO [()]
test x = mapM putStrLn x
Run Code Online (Sandbox Code Playgroud)

请注意,这种方式的return类型test是单位列表-这是因为每次调用都putStrLn返回一个单位,因此将其应用于列表中的每个元素的结果将是单位列表。如果您不想处理这种愚蠢行为,并且将返回类型设置为简单单位,请使用特殊版本mapM_

test :: [String] -> IO ()
test x = mapM_ putStrLn x
Run Code Online (Sandbox Code Playgroud)

  • mapM有很多表亲,包括可遍历可折叠结构(包括列表)的遍历“ traverse”。 (2认同)