我试图编写一个带有模板的函数" 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
我们总是可以假设插槽的数量等于字符串的数量。
答案 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)
根据您的要求,如果插槽和字符串的数量不同,则会崩溃(模式匹配错误)。