Мне нужна функция вроде следующего, возможно ли это? на самом деле, я не знаю, существует ли шаблон Pattern.
fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
pattern -> True
_ -> False
Мне нужна функция вроде следующего, возможно ли это? на самом деле, я не знаю, существует ли шаблон Pattern.
fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
pattern -> True
_ -> False
Обратите внимание на функциональные жемчужины, Type Safe Pattern Combinators. Немного о Googling показывает, что на нем есть пакет Hackage.
Я не думаю, что это возможно в Haskell.
Однако в вашем случае шаблон фактически является просто функцией типа a -> Bool
. Поэтому вместо принятия шаблона принимаем любую функцию от a
до Bool
. Вы, например, эквивалентны применению функции a -> Bool
на a
.
Теперь, если вы хотите сделать что-то более общее, например, возможность использовать совпадающие символы из шаблона в теле fun1
, вы не сможете сделать это с помощью функции. Однако я сомневаюсь, что это возможно с Haskell вообще - для этого потребуются странные расширения системы типов. Совпадение шаблонов в Haskell вовсе не является первоклассным гражданином, поэтому вы не можете передавать шаблоны таким образом.
Если вы хотите такого поведения, ознакомьтесь с книгой Pattern Calculus, где автор разрабатывает и формализует язык с более общим сопоставлением шаблонов чем Haskell. Это делает образцы первоклассным гражданином, в отличие от Haskell. Я еще не закончил эту книгу, но я уверен, что такой код именно то, что вы могли бы написать, между прочим.
Автор построил язык вокруг своих представлений о сопоставлении шаблонов под названием bondi; это, вероятно, также стоит проверить, особенно если вы не хотите беспокоиться о книге. Я не знаю, готова ли она для практического использования, но это, безусловно, интересно.
Я уверен, что вы ищете 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