实现一个函数接受参数的过滤器

Implementing a filter whose function takes an argument

我正在写一些 Haskell 旨在获取数字列表并过滤掉任何非三角形的数字。

main :: IO()
main = do
    interact tri

tri :: String -> String
tri =   unwords . 
        map show .
        filter (isSquare (\n -> (8*n+1))) . 
        map (read :: String -> Int) . 
        words

isSquare :: (Integral a) => a -> Bool
isSquare n = (round . sqrt $ fromIntegral n) ^ 2 == n

这就是我目前所拥有的。我遇到问题的地方是过滤器。

我不完全理解我可能如何实际访问那个匿名函数中的值(或者,就此而言,如果以这种方式甚至可能的话) .我需要结合使用此函数和 isSquare 来测试每个数字,以确定该数字是否为三角形。我知道这个练习纯粹是学术性的,我只是想主要了解函数组合和 IO。

  1. 表达式(isSquare (\n -> (8*n+1)))是否进行类型检查?为什么不呢?

  2. filter 的类型为 (a -> Bool) -> [a] -> [a]。所以它的第一个参数需要是 (a -> Bool) 类型的函数。你已经几乎了;你在这里想要什么功能,你怎么能用你现有的来构造它?提示:这是单个字符的更改。