簡體   English   中英

Haskell:lambda函數中的Monadic構造

[英]Haskell: Monadic construct within lambda function

我有一個函數的片段:

mapM (\x -> do t' <- t; return $ strSwop "if0" ("if" ++ show x) t') [0..(n-1)]

strSwop :: String -> String -> String -> String
t :: IO String

它按預期工作,但我不喜歡使用lambda的IO構造。 如何以不同的方式寫出來? 我走出monad只是為了再次包裹下一行。 感覺很難看。

如果我這樣做:

mapM (\x -> t >>= strSwop "if0" ("if" ++ show x) t) [0..(n-1)]

它(顯然)抱怨strSwop的返回簽名:( strSwop只是一個字符串替換函數。有沒有辦法正確地寫這個?謝謝。

- 編輯 -

剛想通了......

工作:

mapM (\x -> liftM (strSwop "if0" ("if" ++ show x)) t) [0..(n-1)]

我建議liftM<$>

import Control.Applicative
mapM (\x -> strSwop "if0" ("if" ++ show x) <$> t) [0..(n-1)]

讓我們一步一步地簡化您的代碼。

mapM (\x -> do t' <- t; return $ strSwop "if0" ("if" ++ show x) t') [0..(n-1)]

首先斷開純代碼 - 讓我們使用currying將[0..(n-1)]轉換為[String -> String]列表:

mapM (\f -> do t' <- t ; return (f t)) $ map (\x -> strSwop "if0" ("if" ++ show x)) [0..(n-1)]

現在do t' <- t ; return (ft) do t' <- t ; return (ft)很常見 - 那只是fmap f t'

mapM (\f -> fmap f t') $ map (\x -> strSwop "if0" ("if" ++ show x)) [0..(n-1)]

並且\\f -> fmap f t'只是\\f -> flip fmap t' fflip fmap t'

mapM (flip fmap t') $ map (\x -> strSwop "if0" ("if" ++ show x)) [0..(n-1)]

清理純半: \\x -> strSwop "if0" ("if" ++ show x)\\x -> strSwop "if0" $ ("if" ++) (show x)\\x -> strSwop "if0" . ("if"++) $ show x \\x -> strSwop "if0" . ("if"++) $ show xstrSwop "if0" . ("if"++) . show相同strSwop "if0" . ("if"++) . show strSwop "if0" . ("if"++) . show

mapM (flip fmap t') $ map (strSwop "if0" . ("if"++ ) . show) [0..(n-1)]

現在讓我們將這兩個部分融合在一起。 mapM f . map g = sequence . map f . map g = sequence . map (f . g) = mapM (f . g) mapM f . map g = sequence . map f . map g = sequence . map (f . g) = mapM (f . g)

mapM (flip fmap t' . strSwop "if0" . ("if"++) . show) [0..(n-1)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM