Haskell - 将多个函数传递给一个函数

Haskell - Passing multiple functions into a function

我正在尝试将两个函数传递给 'myfunc' 以执行 Int 列表元素的操作。

*这纯粹是为了测试——我知道我可以使用过滤器,甚至等等。只是在这里测试代码

 addone :: Int -> Int
 addone i = i + 1
 addoone _ = 0

checkeven :: Int -> Bool
checkeven n 
   | even n == True = True
   | otherwise      = False

myfunc :: (Int -> Bool) -> (Int -> Int) -> [Int] -> [Int]
myfunc ce ao [] = []
myfunc _ ao (x : xs) = []
myfunc ce _ (x : xs) = []
myfunc ce ao (x : xs) = if ce x then ao x : tail else tail where
   tail = myfunc ce ao xs

mylist = [1,2,3,3,3,1,1,4]
main = do
  let x = myfunc checkeven addone mylist
  putStrLn $ show x

尝试 运行 'Non-exhaustive patterns' 时出错...有什么想法吗?

myfunc 中,这两行是无用的,因为在模式匹配时它们意味着相同的事情(而且它们不是您正在寻找的递归的最后阶段):

myfunc _ ao (x : xs) = []
myfunc ce _ (x : xs) = []

同样在第一个模式匹配中 ce ao 是没用的,因为它们没有在任何地方使用所以它们应该是 _

所以 myfunc 应该是这样的:

myfunc :: (Int -> Bool) -> (Int -> Int) -> [Int] -> [Int]
myfunc _ _ [] = []
myfunc ce ao (x : xs) = if ce x then ao x : tail else tail where
   tail = myfunc ce ao xs

细分如下:

addone :: Int -> Int
addone i = i + 1
addone _ = 0

最后一行在这里是无关紧要的,因为第一行将匹配所有内容。

checkeven :: Int -> Bool
checkeven n 
   | even n == True = True
   | otherwise      = False

这可以写成checkeven = even

myfunc :: (Int -> Bool) -> (Int -> Int) -> [Int] -> [Int]
myfunc ce ao [] = []
myfunc _ ao (x : xs) = []
myfunc ce _ (x : xs) = []
myfunc ce ao (x : xs) = if ce x then ao x : tail else tail where
   tail = myfunc ce ao xs

匹配第1行的条件是"the list is empty"。匹配第 2 行和第 3 行的条件是 "the list isn't empty"。因此,第 3 行和第 4 行永远不会匹配。

RE 错误,我看不出它是从哪里来的。请 post 重现问题并清除错误消息的完整代码。