Почему все синонимы рекурсивного шаблона отклоняются?
{-# 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
К чему это должно привести?
Шаблоны не являются первоклассными ценностями. Они просто заменены их определениями, где они появляются. Для такого языка рекурсивные определения обычно не имеют смысла.