繁体   English   中英

Haskell类型检查/模式匹配

[英]Haskell type checking/pattern matching

当我尝试检查表达式的计算结果是否为Cons _ _形式时,以下Haskell代码抱怨在第二行。 Haskell的错误消息是:“表达式上下文中的模式语法:_”-我想知道的是-有没有办法完成我想做的事情??? 看来我想做的是在运行时检查表达式的类型,从我所读的内容中可能意味着我可以对此进行更好的编程? 但是,由于我是一个初学者,所以我不知道那是不是我正在做的事情,特别是因为我已经尝试了最后一个小时了。

data Val = Num Int | Nil | Cons Val Val
    deriving (Eq, Show, Read)

interpret_expr :: Prog -> Vars -> Expr -> Val
interpret_expr _ _ (Isnum NilE) = Num 0
interpret_expr _ _ (Isnum (ConsE _ _)) = Num 0
interpret_expr _ _ (Isnum (NumE _)) = Num 1
interpret_expr prog vars (Isnum expr)
    | interpret_expr prog vars expr == Nil = Num 0
    | interpret_expr prog vars expr == Cons _ _ = Num 0
    | otherwise = Num 1
interpret_expr prog vars (Isnum expr)
    | interpret_expr prog vars expr == Nil = Num 0
    | interpret_expr prog vars expr == Cons _ _ = Num 0
    | otherwise = Num 1

您对卫兵的使用无效。 您不能将功能(此处为(==)功能)应用于模式。 也就是说,您不能比较(使用Eq类型类)某些东西和Cons _ _ 您需要再次进行模式匹配,可以使用case .. of来完成:

interpret_expr prog vars (Isnum expr) = case interpret_expr prog vars expr of
    Nil -> Num 0
    Cons _ _ -> Num 0
    _ -> Num 1

检查值是否具有特定的构造函数是很常见的事情。 很多时候,您会看到以下形式的手写片段:

isCons (Cons _ _) = True
isCons _          = False

它将用作:

| isCons (interpret_expr prog vars expr) = Num 0

这是很常见的各种源对源重写工具将增加is[Some Constructor]功能(例如: deriveDriFT )。 我偏爱模板haskell解决方案(因为它们不需要运行外部工具,不是因为TH非常干净或稳定)。 如果安装derive库,则代码可能如下所示:

import Data.Derive.Is
import Data.DeriveTH
import Language.Haskell.TH

data Val = ...
  deriving (Eq, Ord, Show)

$(derive makeIs ''Val)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM