我需要编写一个函数,它将计算模板中的插槽数。这样Builder
。我有函数原型
template ({})foo{}{} = 3
还有一些辅助函数:
template :: Template -> Int
templatey (Template xs) =
我写道:
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
而且我想我需要以某种方式使用地图来检查输入模板是否与temp匹配。但是,我找不到如何做到的方法。任何帮助都非常感谢。
答案 0 :(得分:2)
这样的事情应该有效:
template :: Template -> Int
template (Template xs) = sum $ map (\x -> either (\_ -> 0) (\_ -> 1) x) xs
如果您看到Right
值构造函数的值,则返回1
其他0
。最后你总结一下来获得插槽的数量。
或者正如尤里指出的那样,这更优雅:
template :: Template -> Int
template (Template xs) = sum $ map (either (const 0) (const 1)) xs
甚至这个:
import Data.Either (rights)
template :: Template -> Int
template (Template xs) = length $ rights xs
ghci
演示:
λ> template $ Template [Right Slot, Right Slot, Right Slot]
3
λ> template $ Template [Right Slot, Right Slot, Right Slot, Left "hi"]
3
λ> template $ Template [Right Slot, Right Slot, Right Slot, Left "hi", Right Slot]
4
λ> template $ Template []
0