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 重现问题并清除错误消息的完整代码。
我正在尝试将两个函数传递给 '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 重现问题并清除错误消息的完整代码。