2013-02-21 109 views
0

以下代碼不能編譯。我收到一個類型錯誤。我認爲這將是更好的版本,因爲它明確地分開了兩種不同的情況... 該功能應該有助於確定有限狀態機是否接受輸入單詞。Haskell - 類型/模式匹配

import Text.Show.Functions 
import qualified Data.Set as Set 
import qualified Data.List as List 

setTransition :: (Int -> Char -> [Int]) -> [Int] -> Char -> [Int] 
setTransition delta [] sigma   = [] 
setTransition delta [email protected][x:xs'] sigma = foldl f [] xs 
       where f ys q = (delta q sigma) `List.union` ys 

這(刪除了模式匹配)但是編譯。有人可以告訴我爲什麼?

import Text.Show.Functions 
import qualified Data.Set as Set 
import qualified Data.List as List 

setTransition :: (Int -> Char -> [Int]) -> [Int] -> Char -> [Int] 
setTransition delta [] sigma   = [] 
setTransition delta xs sigma = foldl f [] xs 
       where f ys q = (delta q sigma) `List.union` ys 

THX幫助

+7

'xs @(x:xs')',而不是'xs @ [x:xs']'。 – luqui 2013-02-21 18:17:20

+0

啊..謝謝^^解決了問題... – 2013-02-21 18:20:01

回答

6

你只是有一個語法錯誤:

[email protected][x:xs'] 

應該

[email protected](x:xs') 

但你實際上並不需要兩種情況,因爲

foldl f b [] = b 

所以

foldl f [] [] = [] 

就像你的空單的情況下需要。

事實上,這是相當罕見的[]模式不匹配模式匹配上(x:xs)和使用xxs - 這就是我怎麼知道去想foldl是否會給你正確的答案在這兩種情況下。但它確實偶爾會發生。