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

时间:2016-12-29 18:44:45

标签: haskell lambda-calculus

我正在研究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减少的形式。

2 个答案:

答案 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