2014-04-16 31 views
0

元組列表的尾部,我有以下代碼:選擇在Haskell

type DecV = [(Var,Aexp)] 

d_v_ds :: DecV -> (EnvV, Store) -> (EnvV, Store) 
d_v_ds [] (envV, sto) = (envV, sto) 
d_v_ds [(v, xAexp)] (envV, sto) = do 
       d_v_ds (tail ([(v, xAexp)])) (envV', sto') 

,當我嘗試運行此我得到一個非exhastive模式錯誤。我試圖將功能更改爲:

d_v_ds :: DecV -> (EnvV, Store) -> (EnvV, Store) 
d_v_ds [] (envV, sto) = (envV, sto) 
d_v_ds [(v, xAexp): a] (envV, sto) = do 
        d_v_ds (a) (envV', sto') 

函數不會編譯。我怎樣才能做到這一點? 謝謝

+0

那些'envV''和'sto''從哪裏來? –

回答

1

的問題是,你的函數d_v_ds不與許多元素,但只有空列表[]和一個元素[(v, xAexp)]名單採取帳戶列表。我想你誤解了Haskell的語法,因爲你使用tail [(v,xAexp)]來取一個元素列表的尾部。 我不知道是什麼envV'sto'的,但如果我正確你想要做什麼理解,工作列表中的每個元素上,你的函數可以寫成:

d_v_ds :: DecV -> (EnvV, Store) -> (EnvV, Store) 
d_v_ds []    (envV, sto) = (envV, sto) 
d_v_ds ((v, xAexp):xs) (envV, sto) = d_v_ds xs (envV', sto') 

匹配((v,xAexp):xs)包含所有你需要的:(v,xAexp)是列表的頭部,xs是列表的尾部,(v,xAexp):xs表示你正在等待由至少一個元素組成的列表(xs可以爲空)。

+0

請注意'[(v,xAexp):a]'不會編譯,因爲它的類型是[[[(Var,Aexp)]]]而不是'[(Var,Aexp)]'。正確的語法沒有'[]'並且被'()'包圍,就像'((v,xAexp):a)'。 – mariop

0

試試這個:

d_v_ds [] (envV, sto) = (envV, sto) 
d_v_ds (_:rst) (envV, sto) = d_v_ds rst (envV', sto') 
    where envV' = ... 
      sto' = ... 
3

正如編譯器所說,你的模式匹配是不完整的,這意味着在某種意義上輸入的所有可能的變化都不會被捕獲。

可以說,我們必須要實現以下功能:

aFunc :: [a] -> b 

考慮以下模式匹配:

-- Matches an empty list 
aFunc [] = ... 

-- Matches anything 
aFunc x = ... 

--Matches one member list 
aFunc [x] = ... 

-- Matches a two member list 
aFunc [x,y] = ... 

-- Matches a list with atleast one member 
aFunc (x:xs) = ... 

-- A mutually exhaustive set 
aFunc [] = ... 
aFunc (x:xs) = ... 

此外,圖案依次匹配,所以容易設計,通常要確保你的一組模式匹配是相互詳盡的,並且保持你的基本情況定義爲第一個。

在你的情況,你應該修改你的函數是這樣的:

d_v_ds :: DecV -> (EnvV, Store) -> (EnvV, Store) 
d_v_ds [] (envV, sto) = (envV, sto) 
d_v_ds ((v, xAexp): xs) (envV, sto) = d_v_ds xs (envV', sto') 

但是,請注意,envV」尚未確定。而這個函數似乎最終只會返回你在第一次調用中給出的第二個參數。