为什么我的变量不在作用域中?看起来一切正常,但它不起作用。
myEven::[Int] -> [Int]
myEven [] = []
myEven (x:xs) = if x `mod` 2 == 0 then x:myEven xs
else myEven xs
我现在正在测试,它正在工作,但没有第一行。我的错误在哪里?
另一个问题是,如何在模式匹配中重写此函数
发布于 2018-12-14 03:17:26
为什么变量不在作用域中?
可能是加载文件失败,也可能是其他原因,很难在看不到错误和调用的情况下说出来。不管怎样,很高兴它起作用了。
另一个问题,如何在模式匹配中重写此函数
您已经在列表中使用了模式匹配。是否要在Int
上进行模式匹配?例如,你不能在比特上匹配,但我可以看到这是如何整洁的(highBits # 0b0) : xs = x : myEven xs
。
取而代之的是你可以使用卫士:
myEven ::[Int] -> [Int]
myEven [] = []
myEven (x:xs) | x `mod` 2 == 0 = x : myEven xs
| otherwise = myEven xs
发布于 2018-12-14 06:25:58
另一个问题,如何在模式匹配中重写此函数
您已经在模式匹配的可用内容上进行了模式匹配。在任何情况下,只是为了好玩(我不推荐这样做),您可以使用ghc扩展将这些卫士转换为模式。
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
pattern Even n <- (\x -> x <$ guard (x `mod` 2 == 0) -> Just n) where Even n = n
pattern Odd n <- (\x -> x <$ guard (x `mod` 2 == 1) -> Just n) where Odd n = n
myEven ::[Int] -> [Int]
myEven [] = []
myEven (Even x :xs) = x : myEven xs
myEven (Odd x :xs) = myEven xs
https://stackoverflow.com/questions/53768506
复制相似问题