gpt4 book ai didi

haskell,使用 monads 的同一个程序

转载 作者:行者123 更新时间:2023-12-05 00:19:15 24 4
gpt4 key购买 nike

如你所见,我编写了程序,例如:

test "12 124 212" = Right [12, 124, 212]

test "43 243 fs3d 2" = Left "fs3d is not a number"

test :: String -> Either String [Int]
test w = iter [] $ words w
where
iter acc [] = Right (reverse acc)
iter acc (x:xs) = if (all isDigit x) then
iter ((read x):acc) xs
else
Left (x++ "is not a number")

我开始学习 monad。你能告诉我如何使用 monads 来实现它吗?

最佳答案

我想你在找traverse/mapM (它们对于列表是相同的)。您也可以使用 readEither为了简化:

import Data.Traversable (traverse)
import Data.Bifunctor (first)
import Text.Read (readEither)

test :: String -> Either String [Int]
test = traverse parseItem . words

parseItem :: String -> Either String Int
parseItem x = first (const $ x++" is not a number") $ readEither x

那么 mapM 做了什么?它基本上实现了对您手动执行的列表的递归。但是,与标准的 map 函数不同,它采用单子(monad)函数(parseItem 在我们的例子中,其中 Either String 是一个单子(monad))并应用一个步骤在另一个列表中:

iter [] = Right []
iter (x:xs) = do
r <- parseItem x
rs <- iter xs
return (r:rs)

关于haskell,使用 monads 的同一个程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36341654/

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