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

Why is this an invalid eta conversion?

我正在 haskell 中解决一个非常基本的问题。我试图计算字符串中小写字母的数量。我的解决方案是这样的

import Data.Char

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

我正在查看 lowercaseCount 的实际实施,发现它似乎应该能够减少 eta。我试过这个

lowercaseCount = length $ filter isLower

但是 GHC 对我大喊

Couldn't match expected type [Char] -> Int with actual type Int

我想知道为什么这种 eta 缩减是非法的,以及是否有办法使这个函数能够以缩减 eta 的形式出现。

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

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

lowercaseCount = length . filter isLower
lowercaseCount x = length $ filter isLower x

表示

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

lowercaseCount = length $ filter isLower

表示

lowercaseCount = length (filter isLower)

在 eta 扩展后变为

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

现在应该很明显 (1) 和 (2) 是不等价的。后者将两个参数传递给 length,触发类型错误。