如何用Haskell中的字符串替换模板中的空槽?

时间:2015-09-23 15:28:46

标签: haskell

我试图编写一个带有模板的函数" xs"并用" strs"中的字符串替换空槽。以下是一个例子:

template {}word{}{} ["9", "2", "7"] = 9word27

我正在寻找任何可能有用的帮助。以下是我到目前为止:

template :: Template -> [String] -> String
template (Template xs) strs =

一些辅助函数:

data Slot = Slot
          deriving (Show, Eq)

data Template =
  Template [Either String Slot]
  deriving Eq

instance Show Template where
  show (Template xs) =   concat $ map f xs
    where f (Left x) = x
          f (Right x) = "{}"
data Def =
  Def [Template]
  deriving Eq

我们总是可以假设插槽的数量等于字符串的数量。

1 个答案:

答案 0 :(得分:1)

使用State monad的一个非常简单的解决方案是可能的:

import Control.Monad
import Control.Monad.State 

template :: Template -> [String] -> String
template (Template xs) strs = evalState (foldM f [] xs) strs where 
  f s (Left s') = return (s ++ s')
  f s Right{} = state $ \(r:rs) -> (s++r,rs) 

根据您的要求,如果插槽和字符串的数量不同,则会崩溃(模式匹配错误)。