首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Haskell错误:变量不在作用域中: myEven

Haskell错误:变量不在作用域中: myEven
EN

Stack Overflow用户
提问于 2018-12-14 03:02:38
回答 2查看 108关注 0票数 1

为什么我的变量不在作用域中?看起来一切正常,但它不起作用。

代码语言:javascript
复制
myEven::[Int] -> [Int]
myEven [] = []
myEven (x:xs) = if x `mod` 2 == 0 then x:myEven xs 
                else myEven xs

我现在正在测试,它正在工作,但没有第一行。我的错误在哪里?

另一个问题是,如何在模式匹配中重写此函数

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-14 03:17:26

为什么变量不在作用域中?

可能是加载文件失败,也可能是其他原因,很难在看不到错误和调用的情况下说出来。不管怎样,很高兴它起作用了。

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

您已经在列表中使用了模式匹配。是否要在Int上进行模式匹配?例如,你不能在比特上匹配,但我可以看到这是如何整洁的(highBits # 0b0) : xs = x : myEven xs

取而代之的是你可以使用卫士:

代码语言:javascript
复制
myEven ::[Int] -> [Int]
myEven [] = []
myEven (x:xs) | x `mod` 2 == 0 = x : myEven xs
              | otherwise      = myEven xs
票数 1
EN

Stack Overflow用户

发布于 2018-12-14 06:25:58

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

您已经在模式匹配的可用内容上进行了模式匹配。在任何情况下,只是为了好玩(我不推荐这样做),您可以使用ghc扩展将这些卫士转换为模式。

代码语言:javascript
复制
{-# 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53768506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档