2014-07-15 18 views
6

Natknąłem się na sytuację, w której chciałbym dopasować wzór do operatorów. Powoduje to jednak błąd z GHC na Pattern match(es) are overlapped. Nie rozumiem dlaczego. Czy dopasowanie wzorców do operatorów jest niedozwolone? Zakładam, że od momentu umieszczenia symbolu operatora w nawiasach: converts it into an identifier, powinno to zadziałać.Dopasowanie do wzorca nakładają się - Dopasowanie wzorca do operatorów

test :: (Integer -> Integer -> Integer) -> String 
test (+) = "plus" 
test (-) = "minus" 
test _ = "other" 

Są inne sposoby na osiągnięcie tego, co chcę zrobić. Jestem ciekawy, dlaczego to nie działa.

+9

Twój pierwszy wiersz pasuje do dowolnej funkcji i lokalnie łączy go z operatorem infiksowania +. Kolejne linie są więc nadwyżką wymagań, stąd ostrzeżenie. Zauważ, że symbole funkcji, infix lub nie, mogą być lokalnie odbijane przez dopasowywanie wzorców w ten sposób. Tylko konstruktory pisane wielką literą (lub: -prefixed konstruktory infiksów) i literały pasują tylko same, a następnie tylko w typach pierwszego rzędu. Haskell daje (prawie) nie ma możliwości sprawdzenia intensywności właściwości funkcji: (patrz dalej) możesz wykorzystać tylko ich właściwości ekstensywne, stosując je. "Czy to jest funkcja +?" jest niedozwolone. – pigworker

+0

@pigworker, to wyjaśnia, dlaczego otrzymywałem komunikat "to powiązanie przesłania istniejącą definicję preludium". dzięki za informację. –

Odpowiedz

12

(+) i (-) nie są konstruktorami typu Integer -> Integer -> Integer:

  • Nie są nazwy konstruktora
  • Integer -> Integer -> Integer nie jest algebraicznym typ danych

I tak kod jest równoważne użyciu dowolnego inne nazwy zmiennych do wiązania pierwszego argumentu, np

test foo = "plus" 
test bar = "minus" 
test _ = "other" 

, która, mam nadzieję, wyjaśnia, że ​​wszystkie trzy wzory faktycznie pasują do wszystkiego (a pierwsze dwa wiążą niektóre nazwy). Innymi słowy, nie ma sposobu, aby pierwszy wzorzec (foo lub (+) w twoim przykładzie) przepadł, dlatego pokrywa się z pozostałymi dwoma.

+0

zrozumiałe. dzięki! –

Powiązane problemy