2012-07-05 2 views
12

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

fun1 a :: Pattern a -> a -> Bool 
fun1 pattern a = case a of 
    pattern -> True 
    _ -> False 
+1

Я не говорю F #, но я думаю, что [активные шаблоны] (HTTP: // msdn.microsoft.com/en-us/library/dd233248.aspx) может сделать что-то подобное. – phg

ответ

13

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

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

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

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

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

+0

ghc имеет расширение ViewPattern с версии 6.10 (04-ноя-2008). С этим синтаксическим расширением эти «шаблоны» - это просто отображение функций из анализируемого значения в соответствие с результатом к будущему. – comonad

+0

@ comonad: Я не уверен, что расширение ViewPattern применимо здесь - оно позволяет использовать функции как шаблоны, где OP хочет использовать шаблоны в качестве функций. –

+0

Я имел в виду ваш второй раздел: «..., как возможность использовать совпадающие символы из шаблона в теле fun1, вы не сможете сделать это с помощью функции». Ну, используя ViewPatterns, эта функция/pattern должна возвращать согласованные привязки, чтобы вызывающий мог связать их со своими собственными переменными или сопоставить их с шаблоном. Если бы это было слишком многословным (и если я правильно помню), существует трюк с RecordWildcards, который позволяет комбинировать определенные именованные переменные с одним значением. – comonad

0

Я уверен, что вы ищете 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 
+1

Я думаю, что он просил об обратном - вместо использования функций в качестве шаблонов он хотел использовать шаблоны как функции. Поэтому он хотел иметь возможность называть 'fun1 (Just x) a' и сопоставлять значение' a' с * pattern * 'Just x'.Это то, что позволяет библиотека, связанная с принятым ответом. Я не думаю, что ViewPatterns позволяют вам это делать. –

+0

Tikhon Jelvis: Интересно, не считал этот взгляд. На самом деле Джейсон попросил использовать шаблоны в качестве шаблонов. Но сделать функцию из шаблона тривиальна. AFAIC Джейсон является новичком в Stackoverflow и просто принял любой ответ, не комментируя его; Я не уверен, что ему нужен только один конкретный ответ. – comonad

Смежные вопросы