[英]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' f
或flip 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 x
與strSwop "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.