Thread View: pl.comp.lang.funkcyjne
4 messages
4 total messages
Started by Zbyszek Malec
Wed, 07 Sep 2005 21:47
[Haskell] head xs a x:xs
Author: Zbyszek Malec
Date: Wed, 07 Sep 2005 21:47
Date: Wed, 07 Sep 2005 21:47
26 lines
1483 bytes
1483 bytes
Hej
Mam w haskellu taką prostą funkjcę:
ta się kompiluje
delete :: Char -> String -> String
delete c [] = []
delete c xs | c == (head xs) = delete c (tail xs)
| otherwise = (head xs):delete c xs
a ta już nie
delete :: Char -> String -> String
delete c [] = []
delete c x:xs | c == x = delete c xs --linia 131
| otherwise = x:delete c xs
Różnią sie tylko zastąpieniem x przez wywołanie funkcji head oraz xs
poprzez tail. Dlaczego tak jest? Nie jestem biegły w Haskellu, więc może to
jest kwestia doczytania czegoś, ale nie wiem nawet dlaczego miało by to być
źle.
Błąd jaki dostaję to:
Main.hs:131:0: Parse error in pattern
--
Zbigniew Malec Ustronie 104 gg:2756100
Re: [Haskell] head xs a x:xs
Author: Zbyszek Malec
Date: Wed, 07 Sep 2005 22:04
Date: Wed, 07 Sep 2005 22:04
10 lines
1078 bytes
1078 bytes
Zbyszek Malec wrote (tak! stara dobra wrotka!): > Błąd jaki dostaję to: > Main.hs:131:0: Parse error in pattern Oczywiście nie x:xs tylko (x:xs). Idiota ze mnie. Szkoda że serwer nie przyjmuje cancela. Ale jeszcze tu wrócę! :> -- Zbigniew Malec Ustronie 104 gg:2756100
Re: [Haskell] head xs a x:xs
Author: Tomasz Zielonka
Date: Thu, 08 Sep 2005 06:22
Date: Thu, 08 Sep 2005 06:22
26 lines
1958 bytes
1958 bytes
Zbyszek Malec wrote:
> Hej
> Mam w haskellu taką prostą funkjcę:
>
> ta się kompiluje
> delete :: Char -> String -> String
> delete c [] = []
> delete c xs | c == (head xs) = delete c (tail xs)
> | otherwise = (head xs):delete c xs
Widzę, że sam sobie poradziłeś z problemem. Kilka komentarzy nt. tej
implementacji:
- używanie head i tail, szczególnie w takiej ilości, jest złym
pomysłem, szczególnie jeśli już się używa pattern-matchingu. Błędy
czasu wykonania (np. head []) nie będą dawać żadnej informacji o ich
miejscu wystąpienia (pewnie sobie z tego zdajesz sprawę).
- jest błędna - delete 'a' "aaabc" = "bbbbbbbbbbbbbbbbbbbbbbbb.....
winne jest użycie xs zamiast (tail xs) na końcu ostatniej linijki.
- niepotrzebnie zawężony typ funkcji - gdybyś usunął sygnaturę typu,
kompilator sam zauważyłby
delete :: Eq a => a -> [a] -> [a]
A może właśnie się uczysz i jeszcze nie dotarłeś do klas typów?
Oczywiście nie zachęcam do niepisania sygnatur typu
Best regards
Tomasz
Re: [Haskell] head xs a x:xs
Author: Zbyszek Malec
Date: Thu, 08 Sep 2005 13:28
Date: Thu, 08 Sep 2005 13:28
17 lines
1511 bytes
1511 bytes
Tomasz Zielonka wrote (tak! stara dobra wrotka!): > - jest błędna - delete 'a' "aaabc" = "bbbbbbbbbbbbbbbbbbbbbbbb..... > winne jest użycie xs zamiast (tail xs) na końcu ostatniej linijki. Faktycznie, ale to wina copy-paste z poprzedniej wersji. > - niepotrzebnie zawężony typ funkcji - gdybyś usunął sygnaturę typu, > kompilator sam zauważyłby > delete :: Eq a => a -> [a] -> [a] > A może właśnie się uczysz i jeszcze nie dotarłeś do klas typów? Uczę się właśnie Haskella i jeszcze nie mam zbytniej wprawy. Faktyczcnie taka sygnatura typu jest lepsza. Dzięki za uwagi. -- Zbigniew Malec Ustronie 104 gg:2756100
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads