[英]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]
功能(例如: derive
和DriFT
)。 我偏愛模板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.