我正在研究haskell中一个非常基本的问题。我试图计算字符串中的小写字母数。我的解决方案就是这个
import Data.Char
lowercaseCount :: String -> Int
lowercaseCount x = length $ filter isLower x
我正在查看lowercaseCount
的实际执行情况,看到它似乎应该能够减少eta。我试过这个
lowercaseCount = length $ filter isLower
但是GHC对我大吼大叫
无法匹配预期类型
[Char] -> Int
实际类型Int
我想知道为什么这个eta减少是非法的,并且如果有办法使这个功能能够以eta减少的形式。
答案 0 :(得分:9)
\usepackage{eso-pic,graphicx,transparent}
\newcommand{\markasdraft}{
\AddToShipoutPictureFG{
\AtPageCenter{% or \AtTextCenter
\makebox[0pt]{\rotatebox[origin=c]{45}{%
\scalebox{15}{\texttransparent{0.05}{DRAFT}}%
}
}
}
}
}
装置
lowercaseCount x = length $ filter isLower x
,而
lowercaseCount x = length (filter isLower x) -- (1)
装置
lowercaseCount = length $ filter isLower
在eta-expansion之后的
lowercaseCount = length (filter isLower)
现在显而易见的是,(1)和(2)不相等。后者将两个参数传递给lowercaseCount x = length (filter isLower) x -- (2)
,触发类型错误。
答案 1 :(得分:5)
您需要使用功能组合而不是应用程序。因为您只是部分应用filter
,所以会产生一个功能。
您需要将其撰写为length
而不是应用它:
lowercaseCount = length . filter isLower