相关疑难解决方法(0)

如何摆脱$(...)和[| 使用Template Haskell函数时的... |]语法?

我正在尝试学习一些模板Haskell.作为练习,我写的,可以生成诸如函数isLeftisRight(灵感来自这个问题).这是我谦虚的尝试:

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 template-haskell

12
推荐指数
1
解决办法
469
查看次数

Haskell函数,它接受一个类型和一个值,并检查value是否具有该类型

我正在尝试在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的等价物.这有可能吗?我很难在谷歌找到类似的东西,也许是因为我不知道该怎么称呼这种情况.

haskell types

10
推荐指数
1
解决办法
476
查看次数

我能问一下它是左(还是右)?

我知道我通常可以只进行模式匹配,但有时我会发现这些函数很有用:

isLeft  = either (const True) (const False)
isRight = either (const False) (const True)
Run Code Online (Sandbox Code Playgroud)

标准库中有类似的东西吗?

haskell either

8
推荐指数
3
解决办法
5332
查看次数

标签 统计

haskell ×3

either ×1

template-haskell ×1

types ×1