2015-01-27 3 views
1

Я получаю эту ошибку:Ошибка типов в Haskell

Type error in application 
*** Expression  : length (filter (flip (==) x)) 
*** Term   : filter (flip (==) x) 
*** Type   : [b] -> [b] 
*** Does not match : [a] 

Это мой код:

numocc::(Eq a) => a -> [[a]] -> [Int] 
numocc = map.((length.).(f)) 

f:: (Eq a) => a -> [a] -> a 
f = filter.(flip (==)) 

Я не могу понять типы. Кто-нибудь может мне помочь?

+2

Почему вы 'flip'ping' == '? Он должен быть коммутативным. – Shoe

+0

Без проверки этой ошибки все равно на самом деле –

ответ

3

Если я ставлю определение из f в GHCI, Я получаю:

Expected type: (a -> Bool) -> [a] -> a 
    Actual type: (a -> Bool) -> [a] -> [a] 
In the first argument of `(.)', namely `filter' 
In the expression: filter . (flip (==)) 

Иными словами, что представляет собой список типов a, когда ожидается один экземпляр типа a. Если вы применяете предикат к списку, и результат должен быть одним экземпляром, то вы, вероятно, захотите сделать какую-то сгиб.

Изменение типа f в

f:: (Eq a) => a -> [a] -> [a] 

делает этот код компилируется.

4

Вы пытаетесь слишком трудно быть свободна, просто использовать:

f :: (Eq a) => a -> [a] -> [a] 
f x = filter (== x) 

, а затем:

numocc :: (Eq a) => a -> [[a]] -> [Int] 
numocc x = map (length . f x) 

Live demo

+0

Неудачно, я должен быть свободным от точечного, потому что это моя задача –

+1

@KoinArab Ваша задача написать нечитаемый код ради того, чтобы быть точным? – Shoe

+0

Exacly. Это одно из моих тестовых упражнений. –

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