我正在尝试学习一些模板Haskell.作为练习,我写的,可以生成诸如函数isLeft和isRight(灵感来自这个问题).这是我谦虚的尝试:
isA connam = do
ConE nam <- connam
nn <- newName "p"
lamE [varP nn] $ caseE (varE nn) [
match (conP nam [wildP]) ( normalB [| True |] ) [],
match wildP ( normalB [| False |] ) []
]
Run Code Online (Sandbox Code Playgroud)
问题是我必须写$(isA [| Left |])而不是更直观isA Left.是否有可能摆脱丑陋的语法?我似乎无法在文档中找到答案.
该函数仅适用于单参数构造函数,但这是另一个问题.
我正在尝试在Haskell中创建一个简单的Scheme解释器.作为其中的一部分,我正在实现一些原始运算符,如数字?,字符串?等等
我有这样的代码:
isNumber :: [LispVal] -> LispVal
isNumber ([Number n]) = Bool True
isNumber _ = Bool False
isString :: [LispVal] -> LispVal
isString ([String n]) = Bool True
isString _ = Bool False
Run Code Online (Sandbox Code Playgroud)
而我喜欢的是类似的东西
isType :: ?? -> [LispVal] -> LispVal
isType (typeName [typeName n]) = Bool True
isType _ = Bool False
Run Code Online (Sandbox Code Playgroud)
换句话说,我想通过说"isType Number"来创建isNumber的等价物.这有可能吗?我很难在谷歌找到类似的东西,也许是因为我不知道该怎么称呼这种情况.
我知道我通常可以只进行模式匹配,但有时我会发现这些函数很有用:
isLeft = either (const True) (const False)
isRight = either (const False) (const True)
Run Code Online (Sandbox Code Playgroud)
标准库中有类似的东西吗?