2014-07-15 37 views
0

我試圖做一個函數來驗證,如果在列表中存在(我用的圖表工作)節點:哈斯克爾錯誤:在功能上非詳盡模式

buscaNodo :: [(Nodo,Peso)]->Nodo->Bool 
buscaNodo _[] = False 
buscaNodo ((a,b):ar) n 
     |(n == a)= True || (buscaNodo ar n) 
     |(n /= a)= False || (buscaNodo ar n) 
     |otherwise = False 

該函數返回我的真實總是該節點存在於列表中;但如果它不存在於列表中haskell向我顯示一個錯誤:函數buscaNodo中的非窮舉模式,我需要一些幫助,我最近在學習haskell,沒有自己解決問題的必要知識。我爲我可怕的英語感到抱歉。謝謝大家

+2

你能提供'Nodo','Peso'和你得到的錯誤信息的定義嗎?這些信息使得更容易弄清楚你的實際問題是什麼。 – bheklilr

+0

此外,我會建議使用更高級別的功能來解決這個問題。如果您只需要查找是否列表中有'n',那麼您可以通過'map fst'和'elem'的組合輕鬆完成,比如'buscaNodo graph n = elem n $ map fst graph '。這並不能解決你所遇到的錯誤,但它會成爲你想要做的事情的替代解決方案。 – bheklilr

+0

'Nodo'只是一個'字符串'。 '比索'是'(Int,Float)'的雙倍。在這個函數中我不使用'比索',我只想知道一個字符串是否存在於列表中。但是當它不存在時,出現錯誤:'函數buscaNodo中的非窮舉模式' –

回答

5

該問題正是由於type Nodo = String的定義。由於String本身就是Char秒的名單,這意味着,當你有圖案

buscaNodo _ [] = False 

這相當於

buscaNodo _ "" = False 

你實際上是在匹配空字符串。你大概意思是讓這些參數切換:

buscaNodo [] _ = False 

當空的名單上查找任何元素(_)將始終返回False

您還可以極大地利用內置功能來與哈斯克爾簡化了這樣的定義:

buscaNodo :: [(Nodo, Peso)] -> Nodo -> Bool 
buscaNodo graph node = elem node $ map fst graph 

現在你不必擔心任何情況下都沒有。

+0

它確實有用,我對Haskell有太多的瞭解。我更瞭解它。謝謝你的建議 –

+0

@RayMontiel起初很難掌握Haskell,但實際上你的解決方案只不過是我給出的一個專門的實現版本。如果您要查看「map」和「elem」的定義,您會看到它們(尤其是'elem')和您的代碼之間的驚人相似之處。你寫的東西沒有錯,只需要更多的工作,這要歸功於內建的Haskell。你當然是在正確的道路上,儘管可以在你的布爾邏輯中進行一些簡化,即'n == a = True'和'n = a = buscaNodo ar n',否則''是多餘的。 – bheklilr

4

您的buscaNodo函數有兩種情況。一個是當第二個參數是空字符串時。另一個是當第一個參數是非空列表。

但是當第一個參數是一個空列表而第二個參數是非空字符串時呢?當第一個參數爲空且第二個參數非空時調用該函數時,兩個定義都不適用。因此你會得到一個不完全的模式錯誤。