实现一个函数接受参数的过滤器
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。
表达式(isSquare (\n -> (8*n+1)))
是否进行类型检查?为什么不呢?
filter
的类型为 (a -> Bool) -> [a] -> [a]
。所以它的第一个参数需要是 (a -> Bool)
类型的函数。你已经几乎了;你在这里想要什么功能,你怎么能用你现有的来构造它?提示:这是单个字符的更改。
我正在写一些 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。
表达式
(isSquare (\n -> (8*n+1)))
是否进行类型检查?为什么不呢?filter
的类型为(a -> Bool) -> [a] -> [a]
。所以它的第一个参数需要是(a -> Bool)
类型的函数。你已经几乎了;你在这里想要什么功能,你怎么能用你现有的来构造它?提示:这是单个字符的更改。