2016-12-29 2 views
2

Je travaille sur un problème assez simple dans haskell. J'essayais de compter le nombre de minuscules dans une chaîne. Ma solution est cePourquoi est-ce une conversion eta invalide?

import Data.Char 

lowercaseCount :: String -> Int 
lowercaseCount x = length $ filter isLower x 

que je cherchais à la mise en œuvre effective de lowercaseCount et vu qu'il semblait qu'elle aurait pu sous-aller d'une réduction de eta. J'ai essayé

lowercaseCount = length $ filter isLower 

mais GHC m'a crié dessus en disant

pourrait ne pas correspondre prévu le type [Char] -> Int avec le type réel Int

Je me demandais pourquoi cette réduction êta est illégale, et s'il y avait un moyen de rendre cette fonction capable d'être sous une forme eta-réduite.

+1

Mon Haskell est assez rouillé, mais votre deuxième version n'a-t-elle pas besoin d'utiliser la fonction de composition ('.') au lieu de l'application (' $ ')? Le filtre sera une fonction car il n'est pas complètement appliqué. – Carcigenicate

+0

@Carcigenicate Yep. C'était ça. Je suis embarrassé. Désolé pour ça. –

Répondre

5

Vous devez utiliser la fonction de composition au lieu de l'application. Parce que vous appliquez seulement partiellement filter, il en résulte une fonction.

Vous devez composer en length au lieu de l'appliquer:

lowercaseCount = length . filter isLower 
+0

Réponse parfaite! Accepter arrive dans 4 minutes. –

9
lowercaseCount x = length $ filter isLower x 

signifie

lowercaseCount x = length (filter isLower x) -- (1) 

tout

lowercaseCount = length $ filter isLower 

signifie

lowercaseCount = length (filter isLower) 

qui, après eta expansion devient

lowercaseCount x = length (filter isLower) x -- (2) 

Il devrait être évident que (1) et (2) ne sont pas équivalentes. Ce dernier passe deux arguments à length, déclenchant une erreur de type.

+0

C'est une excellente façon de le décomposer. – Carcigenicate