为什么这是一个无效的 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
,触发类型错误。
我正在 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 typeInt
我想知道为什么这种 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
,触发类型错误。