2013-02-21 2 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

+0

Ah .. Спасибо ^^ Это решает проблему ... –

ответ

6

Вы только что синтаксическая ошибка:

[email protected][x:xs'] 

должен быть

[email protected](x:xs') 

Но вы на самом деле не нужны два случая, потому что

foldl f b [] = b 

так

foldl f [] [] = [] 

так же, как ваш пустой список случай требует.

На самом деле, это довольно необычный рисунок матч на [] без сопоставления с образцом на (x:xs) и используя x и xs - это, как я знал, что думать о том, foldl даст вам правильный ответ в обеих случаях. Это случается иногда.

Смежные вопросы