Haskell输入输出字符串
我正在尝试读取并打印映射到文件名列表的“readProcess”命令的输出:Haskell输入输出字符串,haskell,io-monad,Haskell,Io Monad,我正在尝试读取并打印映射到文件名列表的“readProcess”命令的输出: files <- readProcess "ls" [] [] let mdList = map ( \file -> do md <- readProcess "mdls" [file] [] return md ) $ splitOn "\n" files in map (\md -> putStrLn md) mdList putStrLn "Complete"
files <- readProcess "ls" [] []
let mdList = map ( \file -> do
md <- readProcess "mdls" [file] []
return md ) $ splitOn "\n" files in
map (\md -> putStrLn md) mdList
putStrLn "Complete"
我读过很多StackOverflow答案,这些答案似乎只是在IO字符串上使用putStrLn,但我不能这么做。另外,我是Haskell的新手,因此也非常感谢您提供的任何其他提示。您正在使用
map :: (a -> b) -> [a] -> [b]
专门针对
map :: (a -> IO b) -> [a] -> [IO b]
最终结果,[IO b]
不是我们需要的。这是一个IO
操作列表,即相当于一个未执行的无参数命令函数列表。
相反,我们需要一个IO
操作,其结果是b
列表:这将是IO[b]
而不是[iob]
图书馆还提供:
mapM :: (a -> IO b) -> [a] -> IO [b]
或者,如果我们不关心收集结果
mapM_ :: (a -> IO b) -> [a] -> IO ()
该库还提供具有翻转参数的变体:
for :: [a] -> (a -> IO b) -> IO [b]
for_ :: [a] -> (a -> IO b) -> IO ()
因此,原始代码可以固定如下:
import Data.Foldable
files <- readProcess "ls" [] []
for_ files $ \file -> do
md <- readProcess "mdls" [file] []
putStrLn md
putStrLn "Complete"
导入数据。可折叠
档案
md一个IO字符串
值不是字符串。想要放一个IO字符串
是没有意义的,因为同样的原因你也不想吃一本烹饪书。我知道IO字符串不是字符串。我在问如何编写IO字符串。@genghiskhan当您“编写”一个IO字符串时,您希望得到什么?机器代码?装配说明?什么?@genghiskhan是的,它相当于一个do
块。但是,如果在函数参数中插入一个do
块,它将始终是一个一元操作,而不是函数可能接受的纯值。map putStrLn
的类型是[String]->[IO()]
,但对于某些X
块,您的do
块中的每个语句都必须具有typeiox
(显然,[IO()]
无法与任何X
的iox
匹配)。但是,mapM\uuu.putStrLn::[String]->IO()
。
import Data.Foldable
files <- readProcess "ls" [] []
for_ files $ \file -> do
md <- readProcess "mdls" [file] []
putStrLn md
putStrLn "Complete"