Haskell模式匹配难题

nic*_*ole 1 haskell list pattern-matching prepend

我试图在一些任意位置搜索可能包含元素("$",未定义)的对列表.我只想在该特殊元素前面搜索列表的一部分,所以我尝试了类似这样的东西(已经意图将元素n和列表xs作为参数):

checkNotSameScope :: Env -> VarName -> Expr -> Expr
checkNotSameScope (xs:("$", Undefined):_) n e = if alreadyThere n xs then BoolLit False
                                                   else BoolLit True
Run Code Online (Sandbox Code Playgroud)

但这不起作用; 编译器似乎表明(xs:..)只处理我的列表前面的SINGLE值.我不能用:表示列表的第一个块; 只有一个元素.回顾过去,这是有道理的; 否则,编译器将如何知道该怎么做?在"x"之类的内容中添加"s"并不能神奇地制作多个元素!但是我该如何解决这个问题呢?

Joa*_*ner 5

不幸的是,即使使用智能编译器和语言,一些编程也无法避免......

在您的情况下,您似乎希望列表的一部分达到特定元素.更一般地说,要查找某些条件下的列表,您可以使用标准库takeWhile函数.然后你可以运行alreadyThere它:

checkNotSameScope :: Env -> VarName -> Expr -> Expr
checkNotSameScope xs n e = if alreadyThere n (takeWhile (/= ("$", Undefined)) xs)
                           then BoolLit False
                           else BoolLit True
Run Code Online (Sandbox Code Playgroud)

它可能不是你想要的列表("$", Undefined)没有发生,所以要小心.