我正在编写一些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。
答案 0 :(得分:3)
表达式(isSquare (\n -> (8*n+1)))
是否类型检查?为什么不呢?
filter
的类型为(a -> Bool) -> [a] -> [a]
。所以它的第一个参数需要是(a -> Bool)
类型的函数。你几乎就是这样;你想在这里做什么功能,你怎么用你拥有的东西来构建它?提示:这是一个单一角色的变化。