2014-12-05 20 views
6

Na przykład z listami, jeśli napiszę regułę z LHS z myFn [x], czy będzie ona również w stanie uruchomić się, gdy programista napisze myFn (x:[])? czy będę musiał napisać osobną regułę dla każdej możliwej składni?Czy reguły przepisywania GHC rozpoznają cukier syntaktyczny?

+0

Wszyscy wiemy, że konstrukcja listy jak "[a, b, c]" jest po prostu cukrem dla 'a: b: c: []', więc te dwa wyrażenia są równoważne, ale druga jest lepszą formą dla wzorca pasujący. – AJFarmar

+1

Cukier syntaktyczny nie ma znaczenia przy przepisywaniu reguł. – augustss

Odpowiedz

7

Reguły ponownego zapisu zostają usunięte. Tak więc zasada re-write jak

{-# RULES 
    "myFn/singleton" forall x. myFn [x] = myOtherFn x 
#-} 

będą przechowywane wewnętrznie jako

forall x. myFn (x:[]) = myOtherFn x 

To wtedy przyłożonego do odcukrzanych postaci programu. (Cała optymalizacja w GHC ma miejsce w postaci pozbawionej słodyczy programu).

4

Rozumiem, że czysto syntaktyczne rzeczy takie jak te nie mają znaczenia; zasada będzie strzelać w obu kierunkach.

Co będzie znaleźć się być problemem jest to, że myFn mogły być wstawiane do czasu GHC próbuje użyć reguły (więc nie będzie nic na to, aby strzelać). Ogólnie rzecz biorąc, ustalenie, kiedy dokładnie włączyć reguły (y), jest trudne!

Powiązane problemy