🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#717
Author: Zbyszek Malec
Date: Wed, 07 Sep 2005 21:47
26 lines
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
#718
Author: Zbyszek Malec
Date: Wed, 07 Sep 2005 22:04
10 lines
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
#719
Author: Tomasz Zielonka
Date: Thu, 08 Sep 2005 06:22
26 lines
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
#720
Author: Zbyszek Malec
Date: Thu, 08 Sep 2005 13:28
17 lines
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