Подтвердить что ты не робот

Могу ли я передать шаблон в функцию?

Мне нужна функция вроде следующего, возможно ли это? на самом деле, я не знаю, существует ли шаблон Pattern.

fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
    pattern -> True
    _ -> False
4b9b3361

Ответ 2

Я не думаю, что это возможно в Haskell.

Однако в вашем случае шаблон фактически является просто функцией типа a -> Bool. Поэтому вместо принятия шаблона принимаем любую функцию от a до Bool. Вы, например, эквивалентны применению функции a -> Bool на a.

Теперь, если вы хотите сделать что-то более общее, например, возможность использовать совпадающие символы из шаблона в теле fun1, вы не сможете сделать это с помощью функции. Однако я сомневаюсь, что это возможно с Haskell вообще - для этого потребуются странные расширения системы типов. Совпадение шаблонов в Haskell вовсе не является первоклассным гражданином, поэтому вы не можете передавать шаблоны таким образом.

Если вы хотите такого поведения, ознакомьтесь с книгой Pattern Calculus, где автор разрабатывает и формализует язык с более общим сопоставлением шаблонов чем Haskell. Это делает образцы первоклассным гражданином, в отличие от Haskell. Я еще не закончил эту книгу, но я уверен, что такой код именно то, что вы могли бы написать, между прочим.

Автор построил язык вокруг своих представлений о сопоставлении шаблонов под названием bondi; это, вероятно, также стоит проверить, особенно если вы не хотите беспокоиться о книге. Я не знаю, готова ли она для практического использования, но это, безусловно, интересно.

Ответ 3

Я уверен, что вы ищете View Patterns.

(см. trac/ghc/wiki или ghc/user-manual/syntax -расширений)


Каждая функция представляет собой "Шаблон":

case "string that ends with x" of
    (last->'x') -> True
    _ -> False

case "foo" of
    (elemIndex 'g'->Just i) -> i+5
    (elemIndex 'f'->Nothing) -> 23
    _ -> 42

do
  x <- fmap foo bar
=
do
  (foo->x) <- bar