Почему все синонимы рекурсивного шаблона отклоняются?

{-# 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)

Итак, такие синонимы просто еще не доступны по техническим причинам, и получим ли мы их в будущем?

1 ответ

Некоторые рекурсивные шаблоны проблематичны, например,

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

pattern L <- () : L

К чему это должно привести?

Шаблоны не являются первоклассными ценностями. Они просто заменены их определениями, где они появляются. Для такого языка рекурсивные определения обычно не имеют смысла.

Другие вопросы по тегам