@jimmyvan: ostatnio używałem sml z 10 lat temu, ale jeśli dobrze pamiętam składnie i rozumiem to dla przypadku x>n zwracasz od razu false, nawet, jak to jest nie liść. Czemu? Przecież x może wtedy i tak być w prawym poddrzewie?
I chyba zamieniłeś przykłady, kiedy działa, a kiedy nie działa? Albo znak ">" w kodzie był odwrotnie?
I dlaczego andalso? True chcesz zwracać tylko, jak w obu poddrzewach jest element?
@jimmyvan: co daje case ponad ify? Powiedzmy, że masz typ Shape, który może oznaczać przeróżne kształty i masz też funkcję area, która liczy pole kształtu. Jeśli dodasz na przykład koło do typu Shape, to w przypadku ifów można łatwo przeoczyć to, że nie rozszerzyłeś funkcji area o liczenie pola koła. Jeśli funkcja area ma w sobie case, to kompilator powinien jakoś ostrzec, że nie wszystkie kształty są obsługiwane.
Ktoś pomoże? Co jest tutaj złego? ;/
Działa dla:
nie działa dla:
#programowaniefunkcyjne #programowanie #sml
Komentarz usunięty przez autora
Komentarz usunięty przez autora
I chyba zamieniłeś przykłady, kiedy działa, a kiedy nie działa? Albo znak ">" w kodzie był odwrotnie?
I dlaczego andalso? True chcesz zwracać tylko, jak w obu poddrzewach jest element?
Jak
fun binSearch (t:int tree) (x:int) =
case t of
Leaf l => l=x
| Node (l,v,r) =>
if x=v then true
else if x<v then binSearch l x
else binSearch r x
Sprawdź na rysunku.
Powiedzmy, że masz typ Shape, który może oznaczać przeróżne kształty i masz też funkcję area, która liczy pole kształtu.
Jeśli dodasz na przykład koło do typu Shape, to w przypadku ifów można łatwo przeoczyć to, że nie rozszerzyłeś funkcji area o liczenie pola koła. Jeśli funkcja area ma w sobie case, to kompilator powinien jakoś ostrzec, że nie wszystkie kształty są obsługiwane.