为什么这是无效的eta转换?

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减少的形式.

chi*_*chi 9

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,触发类型错误.


Car*_*ate 5

您需要使用函数组合而不是应用程序.因为您只是部分应用filter,所以它会产生一个功能.

您需要将其组合length而不是应用它:

lowercaseCount = length . filter isLower
Run Code Online (Sandbox Code Playgroud)