我试图测试将两个函数传递给' 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
在尝试运行“非详尽模式”时出现错误' ...有什么想法吗?
答案 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行永远不会匹配。
重新判断错误,我无法看到它的来源。请发布重现问题的完整代码并清除错误消息。