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

时间:2016-08-31 09:25:45

标签: haskell higher-order-functions

我试图测试将两个函数传递给' 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

在尝试运行“非详尽模式”时出现错误' ...有什么想法吗?

2 个答案:

答案 0 :(得分:3)

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

//receive apns when app in background mode
    let apsInfo: NSDictionary = userInfo["aps"] as! NSDictionary
    if UIApplication.sharedApplication().applicationState != UIApplicationState.Active{

        //TODO: temporary method, need further update
        //judge notification type
        if let _ = userInfo["inviterName"] as? String {
            //notification for group invite
        }else{
            //Update badge number
            if let badgeInt = apsInfo["badge"] as? Int {
                UIApplication.sharedApplication().applicationIconBadgeNumber = badgeInt > 0 ? badgeInt: 1
            }else{
                UIApplication.sharedApplication().applicationIconBadgeNumber = 1
            }
            //turn on trigger to enable message hint btn on recorder vc when it appear
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: REMOTE_NOTIF_REMAINING)
        }
    }
   //receive apns when app in forground mode
    else{
        //TODO: temporary method, need further update
        //judge notification type
        if let _ = userInfo["inviterName"] as? String {
            //notification for group invite
            NSNotificationCenter.defaultCenter().postNotificationName(APP_NOTIF_RECEIVE_GROUP_NOTIF, object:nil)
        }else{
            //notificate recorder vc to display message hint directly
            NSNotificationCenter.defaultCenter().postNotificationName(APP_NOTIF_RECEIVE_REMOTE_NOTIF, object: userInfo)
        }
    }
    APService.handleRemoteNotification(userInfo)
    completionHandler(UIBackgroundFetchResult.NewData)

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

所以 myfunc 应如下所示:

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

答案 1 :(得分:1)

以下是细分:

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行的条件是"列表为空"。匹配第2行和第3行的条件是"列表不是空的"。因此,第3和第4行永远不会匹配。

重新判断错误,我无法看到它的来源。请发布重现问题的完整代码并清除错误消息。