Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell输入输出字符串_Haskell_Io Monad - Fatal编程技术网

Haskell输入输出字符串

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"

我正在尝试读取并打印映射到文件名列表的“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"
我读过很多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
块中的每个语句都必须具有type
iox
(显然,
[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"