Haskell错误:变量不在范围内:myEven

时间:2018-12-13 19:02:38

标签: haskell

为什么我的变量不在范围内? 似乎一切都很好,但是不起作用

function readonly<T>(input: T[]): ReadonlyArray<T> {...}

我正在测试,并且可以正常工作,但没有第一行。 我的错误在哪里?

另一个问题,如何在模式匹配中重写此功能

2 个答案:

答案 0 :(得分:1)

  

为什么我的变量不在范围内?

也许您无法加载文件或其他内容,很难说而没有看到错误和您的调用。无论哪种方式,都很高兴它能起作用。

  

另一个问题,如何在模式匹配中重写此功能

您已经在列表上使用模式匹配。您要在Int上进行模式匹配吗?例如,您无法按位进行匹配,但我可以看到(highBits # 0b0) : xs = x : myEven xs会很整洁。

相反,您可以使用防护装置:

myEven ::[Int] -> [Int]
myEven [] = []
myEven (x:xs) | x `mod` 2 == 0 = x : myEven xs
              | otherwise      = myEven xs

答案 1 :(得分:1)

  

另一个问题,如何在模式匹配中重写此功能

您已经在模式匹配方面进行了模式匹配。无论如何,只是为了好玩(我不推荐这样做),您可以使用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