2013-02-21 114 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是否会给你正确的答案在这两种情况下。但它确实偶尔会发生。