2013-11-27 3 views
0

Вот мой код, как я могу сказать, где п ИНТ между 2..10Haskell не мог соответствовать предполагаемый тип `Integer 'с фактическим типом` [Integer]

data Rank = Numeric Integer | Jack | Queen | King | Ace 
     deriving (Eq, Show) 

valueRank :: Rank ->Integer 
valueRank rank 

|rank ==Jack = 10 
|rank ==King = 10 
|rank ==Queen = 10 
|rank ==Ace = 10 
|rank == Numeric n = n 
    where n =[x|x<-[2..10]] 
+2

'[x | x <- [2..10]] 'возвращает список, поэтому в этой последней строке' n' имеет тип '[Integer]'. Вы действительно не можете ограничить диапазон 'n' на уровне типа. Вы, вероятно, просто захотите проверить его, прежде чем он добавится к 'Numeric' –

ответ

6

Я предлагаю вам использовать шаблон соответствие вместо охранников:

valueRank :: Rank -> Integer 
valueRank Jack = 10 
valueRank King = 10 
valueRank Queen = 10 
valueRank Ace = 10 
valueRank (Numeric n) = n 

Если вы хотите, чтобы убедиться, что числовой не может быть создан с помощью значения вне определенного диапазона, то при создании ранга вы должны использовать smart constructor, который проверяет это свойство:

makeRank n 
    | 1 <= n <= 13 = ... 
    | otherwise = error ... 
Смежные вопросы