Eli*_*off 2 haskell lambda-calculus
我正在研究haskell中一个非常基本的问题.我试图计算字符串中的小写字母数.我的解决方案是这个
import Data.Char
lowercaseCount :: String -> Int
lowercaseCount x = length $ filter isLower x
Run Code Online (Sandbox Code Playgroud)
我正在看实际的实现,lowercaseCount并看到它似乎应该能够减少eta.我试过这个
lowercaseCount = length $ filter isLower
Run Code Online (Sandbox Code Playgroud)
但GHC对我大喊大叫
无法将预期类型
[Char] -> Int与实际类型匹配Int
我想知道为什么这个eta减少是非法的,并且如果有办法使这个功能能够以eta减少的形式.
lowercaseCount x = length $ filter isLower x
Run Code Online (Sandbox Code Playgroud)
手段
lowercaseCount x = length (filter isLower x) -- (1)
Run Code Online (Sandbox Code Playgroud)
而
lowercaseCount = length $ filter isLower
Run Code Online (Sandbox Code Playgroud)
手段
lowercaseCount = length (filter isLower)
Run Code Online (Sandbox Code Playgroud)
在eta-expansion之后变成了
lowercaseCount x = length (filter isLower) x -- (2)
Run Code Online (Sandbox Code Playgroud)
现在显而易见的是,(1)和(2)不相等.后者传递两个参数length,触发类型错误.
您需要使用函数组合而不是应用程序.因为您只是部分应用filter,所以它会产生一个功能.
您需要将其组合length而不是应用它:
lowercaseCount = length . filter isLower
Run Code Online (Sandbox Code Playgroud)