gpt4 book ai didi

Haskell 处理 [IO 字符串]

转载 作者:行者123 更新时间:2023-12-02 02:51:10 25 4
gpt4 key购买 nike

我有以下功能:

lines' :: [IO String]
lines' = getLine : lines'

我希望我可以使用所有强大的列表功能
这个列表,如过滤器等。 但我对 IO monad 的了解
haskell 是可以改进的。

在将 Rx 用于 C# 之后,io_stuff 概念列表说服了我。

有什么办法可以在 haskell 中做我想做的事吗?
就像是:
ten_lines :: [IO String]
ten_lines = take 10 lines'

proc_lines :: [IO String]
proc_lines = [ (l, length l) | l <- lines' ]

谢谢!

最佳答案

Control.Monad 中有一大堆普通的列表函数被修改以与 monad 一起使用.对您的问题特别感兴趣:

sequence :: Monad m => [m a] -> m [a]
mapM :: Monad m => (a -> m b) -> [a] -> m [b]
filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]
foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a

( sequencemapM 实际上是由 prelude 导出的,默认可用。)

例如,让我们看看您的 take 10 lines' 的类型例子:
Prelude Control.Monad> :t take 10 lines'
take 10 lines' :: [IO String]

我们要转这个 [IO String]成单 IO [String]行动。这正是 sequence做!我们可以通过类型签名来说明这一点。所以:
sequence $ take 10 lines'

会做你想做的。

大多数这些函数也有一个以 _ 结尾的版本。 , 喜欢 sequence_ .这与普通函数的效果完全相同,只是它丢弃结果,返回 ()反而。即, sequence_ :: [m a] -> m () .当您出于两个原因实际上并不关心结果时,这是一个不错的选择:它更明确地说明您的意图并且性能可以更好。

所以如果你想打印 10 行而不是获取它们,你可以这样写:
printLines = putStrLn "foo" : printLines

main = sequence_ $ take 10 printLines

关于Haskell 处理 [IO 字符串],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16415772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com