Piszę funkcję upraszczającą wyrażenie Boole'a. Na przykład: Nand(A, A) == Not(A)
. Starałem się wdrożyć tę szczególną regułę za pomocą dopasowywania wzorców, tak:Przypisywanie równości w dopasowaniu wzorca Haskella
-- Operands equivalent - simplify!
simplify (Nand q q) = Not (simplify q)
-- Operands must be different, so recurse.
simplify (Nand q q') = Nand (simplify q) (simplify q')
Po kompilacji, pojawia się błąd:
Conflicting definitions for `q'
Bound at: boolean.hs:73:21
boolean:73:29
In an equation for `simplify'
Chyba rozumiem, co się dzieje, a ja obrobiłem to, ale chciałbym wiedzieć:
- Dlaczego tego rodzaju dopasowywanie wzorców nie jest możliwe?
- Czy istnieje obejście idiomatyczne?
Pełne ujawnienie: jest to związane z zadaniami domowymi, ale celem kursu nie jest poznanie Haskella, a ja i tak rozwiązałem go na swój własny sposób.
wzór, który wykorzystuje zmienną dwukrotnie nazywany jest zakaz -linearny wzór. Istnieją języki, które zapewniają nieliniowe wzorce, takie jak Erlang i myślę, że wybór projektu nie obejmował ich w Haskell. Listę postów na adres http://www.mail-archive.com/[email protected]/msg03721.html zawiera kilka argumentów przeciwko nieliniowym wzorcom, ale są to argumenty wysokiego poziomu. –
Należy zauważyć, że (N i q q ') nie oznacza, że q i q' są różne. q = 3 q '= 3 (myślę, że to jest powód wyboru projektu) –
@Vixen, cóż, jeśli pierwszy wzór nie byłby zgodny, oznaczałoby to, że są one różne w drugim wzorze ... – dflemstr