2016-12-29 6 views
2

Я работаю над довольно простой проблемой в haskell. Я пытался подсчитать количество строчных букв в строке. Мое решение этогоПочему это недопустимое преобразование эта?

import Data.Char 

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

Я смотрел на фактической реализации lowercaseCount и увидел, что казалось, что это должно было быть в состоянии под идти к сокращению ETA. Я попытался это

lowercaseCount = length $ filter isLower 

но GHC кричал на меня, говоря

Не удалось соответствует ожидаемому типа [Char] -> Int с фактическим типом Int

мне было интересно, почему это сокращение ета является незаконным, и если бы был способ сделать эту функцию способной быть в приведенной ниже форме.

+1

My Haskell довольно ржавый, но не ваша вторая версия должна использовать функцию композиции ('.') вместо приложения (' $ ')? Фильтр будет функцией, поскольку он не применяется полностью. – Carcigenicate

+0

@Carcigenicate Yep. Вот и все. Я смущен. Извини за это. –

ответ

5

Вам нужно использовать функциональную композицию вместо приложения. Поскольку вы только частично применяете filter, это приводит к функции.

Вы должны составить его в length вместо того, чтобы применять его:

lowercaseCount = length . filter isLower 
+0

Отличный ответ! Принятие идет через 4 минуты. –

9
lowercaseCount x = length $ filter isLower x 

означает

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

в то время как

lowercaseCount = length $ filter isLower 

означает

lowercaseCount = length (filter isLower) 

, который после того, как эта-расширения становится

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

Теперь должно быть очевидно, что (1) и (2) не эквивалентны. Последний передает два аргумента length, вызывая ошибку типа.

+0

Это отличный способ разбить его. – Carcigenicate