Мне нужна функция, такая как следующая, возможно ли это? Фактически, я не знаю, существует ли шаблон 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 package.
Я не думаю, что это возможно в Haskell.
Однако в вашем случае шаблон является фактически функцией типа a -> Bool
. Поэтому вместо того, чтобы принимать шаблон, принимайте любую функцию от a
до Bool
. Вы, например, эквивалентны применению функции a -> Bool
на a
.
Теперь, если вы хотите сделать что-то более общее, например, использовать совпадающие символы из шаблона в теле fun1
, вы не сможете сделать это с помощью функции. Однако я сомневаюсь, что это возможно с Haskell вообще - для этого потребуются странные расширения системы типов. Совпадение шаблонов в Haskell вовсе не является первоклассным гражданином, поэтому вы не можете передавать шаблоны таким образом.
Если вы хотите такого поведения, ознакомьтесь с книгой Pattern Calculus, где автор разрабатывает и оформляет язык с более общими функциями сопоставления паттерна, чем Haskell. Это делает образцы первоклассным гражданином, в отличие от Haskell. Я еще не закончил эту книгу, но я уверен, что такой код именно то, что вы могли бы написать, среди прочего.
Автор построил язык вокруг своих представлений о сопоставлении шаблонов под названием bondi; это, вероятно, также стоит проверить, особенно если вы не хотите беспокоиться о книге. Я не знаю, готова ли она для практического использования, но это, безусловно, интересно.
ghc имеет расширение ViewPattern с версии 6.10 (04-ноя-2008). С этим синтаксическим расширением эти «шаблоны» - это просто отображение функций из анализируемого значения в соответствие с результатом к будущему. – comonad
@ comonad: Я не уверен, что расширение ViewPattern применимо здесь - оно позволяет использовать функции как шаблоны, где OP хочет использовать шаблоны в качестве функций. –
Я имел в виду ваш второй раздел: «..., как возможность использовать совпадающие символы из шаблона в теле fun1, вы не сможете сделать это с помощью функции». Ну, используя ViewPatterns, эта функция/pattern должна возвращать согласованные привязки, чтобы вызывающий мог связать их со своими собственными переменными или сопоставить их с шаблоном. Если бы это было слишком многословным (и если я правильно помню), существует трюк с RecordWildcards, который позволяет комбинировать определенные именованные переменные с одним значением. – comonad
Я уверен, что вы ищете View Patterns.
(см trac/ghc/wiki или ghc/user-manual/syntax-extensions)
Каждая функция является "Узор":
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
Я думаю, что он просил об обратном - вместо использования функций в качестве шаблонов он хотел использовать шаблоны как функции. Поэтому он хотел иметь возможность называть 'fun1 (Just x) a' и сопоставлять значение' a' с * pattern * 'Just x'.Это то, что позволяет библиотека, связанная с принятым ответом. Я не думаю, что ViewPatterns позволяют вам это делать. –
Tikhon Jelvis: Интересно, не считал этот взгляд. На самом деле Джейсон попросил использовать шаблоны в качестве шаблонов. Но сделать функцию из шаблона тривиальна. AFAIC Джейсон является новичком в Stackoverflow и просто принял любой ответ, не комментируя его; Я не уверен, что ему нужен только один конкретный ответ. – comonad
Я не говорю F #, но я думаю, что [активные шаблоны] (HTTP: // msdn.microsoft.com/en-us/library/dd233248.aspx) может сделать что-то подобное. – phg