Haskell 为什么可以';t模式匹配共享where子句?

Haskell 为什么可以';t模式匹配共享where子句?,haskell,syntax,scope,pattern-matching,Haskell,Syntax,Scope,Pattern Matching,这是我写的,它没有编译 import Data.Maybe func Nothing Nothing = func2 "hello" "world" func x y = func2 "hello" "world" where func2 a b = a ++ b main = print $ func Nothing Nothing 我用警卫重写了它,它成功了。但我想知道为什么会这样。其中子句仅适用于单个模式匹配情况。(虽然它可以适用于一个案件中的多个警卫)仅仅说

这是我写的,它没有编译

import Data.Maybe
func Nothing Nothing = func2 "hello" "world"
func x       y       = func2 "hello" "world"
  where func2 a b = a ++ b
main = print $ func Nothing Nothing

我用警卫重写了它,它成功了。但我想知道为什么会这样。

其中
子句仅适用于单个模式匹配情况。(虽然它可以适用于一个案件中的多个警卫)仅仅说明规则是什么显然是不够的。为什么这些是规则?在
func2
的定义中,变量
x
y
都在范围内。
where
的范围不取决于使用的内容,假设不同的子句将具有不同的模式变量,因此范围不同,因此没有理由相信共享
where
子句是有意义的。模式匹配是管理分层决策过程的一种非常简单的方法:
where
表示法给出了split-then-make-helper,但是,是的,make-helper-then-split有时是很好的。重要的是,如果您想要make-helper-then-split,您不需要
where
,您只需定义一个新的顶级函数,如果你要接近一些本地人,也可以使用
let
。按原样,您可以访问这两个选项;如果
where
共享模式,则只能编写共享绑定。请思考您编写的内容。这和写一样:
func Nothing=func2“hello”“world”;func x y=func2中的func2 a b=a++b“hello”“world”
。为什么您希望
let
绑定在第一个等式中有效?每一种模式都是一个单独的定义。如果您想要共享本地定义,您必须执行类似以下操作:
func x y=case(x,y)of(Nothing,Nothing)->。。。;(_,_) -> ... 其中func2 a b=a++b
,即让顶级函数使用一个单一的全覆盖匹配,并使用一个
案例
进行实际的模式匹配。
test.hs:2:24: error:
    • Variable not in scope: func2 :: [Char] -> [Char] -> [Char]
    • Perhaps you meant ‘func’ (line 2)