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

时间:2015-04-15 07:50:07

标签: haskell filter functional-programming

我正在编写一些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 个答案:

答案 0 :(得分:3)

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

  2. filter的类型为(a -> Bool) -> [a] -> [a]。所以它的第一个参数需要是(a -> Bool)类型的函数。你几乎就是这样;你想在这里做什么功能,你怎么用你拥有的东西来构建它?提示:这是一个单一角色的变化。