gpt4 book ai didi

haskell - 相互递归IO定义

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

我可以写以下内容:

f :: [Int] -> [Int]
f x = 0:(map (+1) x)

g :: [Int] -> [Int]
g x = map (*2) x

a = f b
b = g a

main = print $ take 5 a

一切工作都很好 (ideone)

但是,假设我想要 g 做一些比乘以 2 更复杂的事情,比如要求用户提供一个数字并将其相加,如下所示:

g2 :: [Int] -> IO [Int]
g2 = mapM (\x -> getLine >>= (return . (+x) . read))

那么我该如何结婚呢?

澄清:

基本上,我希望将 f 中的 Int 列表作为 g2 的输入和 Int 列表来自 g2 的 code> 成为 f 的输入。

最佳答案

列表的有效泛化是ListT:

import Control.Monad
import Pipes

f :: ListT IO Int -> ListT IO Int
f x = return 0 `mplus` fmap (+ 1) x

g2 :: ListT IO Int -> ListT IO Int
g2 x = do
n <- x
n' <- lift (fmap read getLine)
return (n' + n)

a = f b
b = g2 a

main = runListT $ do
n <- a
lift (print n)
mzero

您还可以使用一些额外的代码来实现类似 take 的功能:

import qualified Pipes.Prelude as Pipes

take' :: Monad m => Int -> ListT m a -> ListT m a
take' n l = Select (enumerate l >-> Pipes.take n)

main = runListT $ do
n <- take' 5 a
lift (print n)
mzero

示例 session :

>>> main
0
1<Enter>
2
2<Enter>
3<Enter>
7
4<Enter>
5<Enter>
6<Enter>
18
7<Enter>
8<Enter>
9<Enter>
10<Enter>
38

您可以通过 reading the pipes tutorial 了解有关 ListT 的更多信息,特别是 section on ListT .

关于haskell - 相互递归IO定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26622618/

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