0

我正在解析一个字符串,例如“xxxxyzz”,所以如果字符是“x”,那么我需要做一个输出并同时对列表进行更改。下面的代码是

import Data.Char
output l = zipWith (+) rr ll
            where
              out = foldl
                        ( \ (c,a) e ->
                               case c of
                                'x' -> chr c!!0 --output first element of the list
                                       ([1]++tail(c),a) ) -- add [1] to the c list
                        ([0,0,0,0,0],[0,0,0,0,0])
              (ll,rr) = out l 
4

2 回答 2

1

你可以写(不推荐)一些像

output'' :: String -> IO String
output'' = fmap reverse . foldM parseChar []
  where parseChar xs 'x' = putStrLn "'x' to upper" >> return ('X':xs)
        parseChar xs 'y' = putStrLn "'y' to 'W'"   >> return ('W':xs)
        parseChar xs  x  = putStrLn "no transform" >> return ( x :xs)

带输出

*Main> output'' "xyz"
'x' to upper
'y' to 'W'
no transform
"XWz"

但是,从For a Some Monads More (Learn You a Haskell for Great Good!)

你可以写一些像:

import Control.Monad.Writer

output :: String -> Writer [String] String
output [] = return []
output (x:xs) = do
  xs' <- output xs
  x'  <- case x of
         'x' -> tell ["'x' to upper"] >> return 'X'
         'y' -> tell ["'y' to 'W'"]   >> return 'W'
         _   -> tell ["no transform"] >> return x
  return (x':xs')

使用 monads 更加灵活,而使用 Writer 可以让你的代码变得纯粹(纯粹并且你可以控制如何处理 monadic 上下文和数据;而不是直接 IOoutput''函数)。

您可以output在不纯代码中使用函数作为

main = do
  input <- getLine
  let (result, logging) = runWriter $ output input
  putStrLn $ "Result: " ++ result
  putStrLn $ unlines logging

运行输出可能是

*Main> main
hxdynx
Result: hXdWnX
'x' to upper
no transform
'y' to 'W'
no transform
'x' to upper
no transform

您可以将 monad 与诸如“foldM”之类的 monadic 函数结合起来,有些像

output' :: String -> Writer [String] String
output' = fmap reverse . foldM parseChar []
  where parseChar xs 'x' = tell ["'x' to upper"] >> return ('X':xs)
        parseChar xs 'y' = tell ["'y' to 'W'"]   >> return ('W':xs)
        parseChar xs  x  = tell ["no transform"] >> return ( x :xs)

(对数数组颠倒)

于 2012-12-04T08:10:07.070 回答
0

在 Haskell 中,如果不使用 monad,您将无法预测执行顺序。对于初学者,您可能想尝试在do块中进行一些测试main,然后将其重写为单独的函数。

您可能想熟悉 Haskell 中的 IO 概念: http ://www.haskell.org/onlinereport/haskell2010/haskellch7.html#x14-1420007

于 2012-12-04T20:53:13.843 回答