6
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}

data Quun = Foo | Bar | Oink Quun

fooey :: Quun -> Bool
fooey Foo = True
fooey (Oink Yum) = True
fooey _ = False

pattern Yum <- (fooey -> True)

这不会编译(至少在 GHC-7.10.2 中)

/tmp/wtmpf-file10227.hs:1:1:
    Recursive pattern synonym definition with following bindings:
      foo (defined at /tmp/wtmpf-file10227.hs:(6,1)-(8,13))
      Yum (defined at /tmp/wtmpf-file10227.hs:10:1-28)

当然,对于简单的直接自引用模式,这是有道理的。但是,为什么即使是上述的视图模式介导布局也不可能,有什么根本原因吗?我找不到这个令人信服的;毕竟可以内联视图模式并获得一个完全无害的(嗯......至少是允许的)定义:

fooey :: Quun -> Bool
fooey Foo = True
fooey (Oink (fooey -> True)) = True
fooey _ = False

pattern Yum <- (fooey -> True)

那么,由于技术原因,这些同义词是否还没有可用,我们将来会得到它们吗?

4

1 回答 1

5

一些递归模式是有问题的,比如

f :: [()] -> Bool
f L = True
f _ = False

pattern L <- () : L

这应该脱糖到什么程度?

模式不是一流的价值。它们只是在它们出现的地方替换为它们的定义。对于这样的语言,递归定义通常是不明智的。

于 2016-02-16T20:18:27.547 回答