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 に答える