计算haskell中模板中的插槽数

时间:2015-09-21 04:59:55

标签: haskell

我需要编写一个函数,它将计算模板中的插槽数。这样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匹配。但是,我找不到如何做到的方法。任何帮助都非常感谢。

1 个答案:

答案 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