簡體   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