-
X-Received: by 2002:a0c:9955:: with SMTP id i21mr810853qvd.4.1546605289590; Fri, 04
Jan 2019 04:34:49 -0800 (PST)
X-Received: by 2002:a0c:9955:: with SMTP id i21mr810853qvd.4.1546605289590; Fri, 04
Jan 2019 04:34:49 -0800 (PST)
Path: news-archive.icm.edu.pl!news.icm.edu.pl!fu-berlin.de!v55no1229045qtk.0!news-out
.google.com!m21ni13559qta.0!nntp.google.com!v55no1229043qtk.0!postnews.google.c
om!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Fri, 4 Jan 2019 04:34:49 -0800 (PST)
In-Reply-To: <3...@g...com>
Complaints-To: g...@g...com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=5.172.255.6;
posting-account=Sb6m8goAAABbWsBL7gouk3bfLsuxwMgN
NNTP-Posting-Host: 5.172.255.6
References: <c...@g...com>
<f...@g...com>
<a...@g...com>
<7...@g...com>
<a...@g...com>
<6...@g...com>
<0...@g...com>
<a...@g...com>
<1...@g...com>
<e...@g...com>
<6...@g...com>
<1...@g...com>
<2...@g...com>
<5...@g...com>
<9...@g...com>
<q0lcv9$abq$1@gioia.aioe.org>
<1...@g...com>
<4...@g...com>
<1...@g...com>
<0...@g...com>
<3...@g...com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <b...@g...com>
Subject: Re: Jaki język polecić początkującemu? - komentarz do artykułu w
Programista 9/2018
From: fir <p...@g...com>
Injection-Date: Fri, 04 Jan 2019 12:34:49 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Xref: news-archive.icm.edu.pl pl.comp.programming:213166
[ ukryj nagłówki ]W dniu piątek, 4 stycznia 2019 09:40:16 UTC+1 użytkownik g...@g...com napisał:
> W dniu piątek, 4 stycznia 2019 01:13:33 UTC+1 użytkownik fir napisał:
> > > Ogólnie derywację tego programu mam dość dogłębnie opisaną
> > > w pierwszym rozdziale "Pamphletu":
> > > https://github.com/panicz/pamphlet/raw/master/pamphl
et.pdf
> > >
> > > W praktyce zapisałbym go raczej np. tak (jeżeli język
> > > wspierałby leniwą ewaluację):
> > >
> > > (sum (map square (initial 7 (only prime? numbers))))
> > >
> > > gdzie "map", "only" i "initial" są zdefiniowane tak:
> > >
> >
> > jakos nie wyglada mi to na prostsze niz wersja w c
>
> To nie jest tylko kwestia "wyglądania".
> Do zrozumienia tego kodu wystarczy stosować rozumowanie
> "podstawieniowe", które wcześniej pokazałem.
> Do zrozumienia Twojego kodu w C oprócz podstawienia (które też
> jest potrzebne, bo zdefiniowałeś funkcję z parametrem) trzeba
> też rozumieć takie rzeczy, jak przepływ sterowania albo
> operator przypisania.
>
> > a co to jest tam wyzej sum square (inty?) prime? (funkcja?) i numbers (???)
>
> jak mamy wyrażenie
> (sum (map square (initial 7 (only prime? numbers))))
>
> to sygnatury typów będą następujące:
>
> sum :: Num a => [a] -> a
>
> oznacza to, że funkcja "sum" bierze listę elementów o jakimś typie
> numerycznym (czyli takim, dla którego zdefiniowany jest operator dodawania)
> i zwraca element numeryczny. Operator :: czytamy jako "jest typu".
> Rzeczy po lewej stronie operatora "=>" to tzw. "ograniczenia typów",
> zaś to po prawej jest już konkretną sygnaturą. [a] oznacza listę elementów
> typu a.
>
> map :: (a -> b) -> [a] -> [b]
>
> map jest funkcją, która pobiera jakąś funkcję jednoargumentową
> oraz listę elementów, do których można zastosować tę funkcję,
> i zwraca listę elementów typu wynikowego funkcji.
>
> Warto zwrócić uwagę, że choć nasza percepcja jest taka, że "map" jest
> funkcją dwuargumentową, z sygnatury typów możemy wyczytać, że jest to
> funkcja pobierająca jakiś argument (funkcję) i zwracająca funkcję
> pobierającą jakiś argument (listę), czyli - mówiąc w pewnym uproszczeniu
> wszystkie wieloargumentowe funkcje w Haskellu są tak naprawdę jednoargumentowymi
> funkcjami zwracającymi funkcje (ten ficzer nosi nazwę "Currying",
> albo - jak chciała polska tłumaczka książki "Język C++" Stroustrupa
> - "doprawianie" (!))
>
> Funkcji square nie definiowaliśmy, ale jej definicja będzie taka:
>
> square x = x * x
>
> a sygnatura typów to oczywiście
>
> square :: Num a => a -> a
>
> (czyli funkcja, która bierze coś numerycznego i zwraca coś numerycznego
> tego samego typu).
>
> initial :: Int -> [a] -> [a]
>
> Funkcja only pobiera predykat (czyli funkcję zwracającą wartość Boolowską)
> i listę elementów, do których ten predykat daje się zastosować, i zwraca
> "pomniejszoną" listę elementów:
>
> only :: (a -> Bool) -> [a] -> [a]
>
> Warto zwrócić uwagę, że system typów Haskella nie pozwala wyrazić tego,
> że wynik funkcji jest "pomniejszony" (ale są języki, takie jak Idris
> czy Liquid Haskell, w których tego rodzaju własności daje się wyrazić
> w sygnaturze typów)
>
> Wreszcie, numbers to po prostu lista liczb całkowitych:
>
> numbers :: [Int]
>
> > nie wyglada to na prostsze od c (dlugie jakies)
>
> Funkcje "only", "map" i "initial" są już predefiniowane.
> (tylko "only" nosi tak naprawdę nazwę "filter", a "initial" -- "take").
> Ty w C użyłeś np. operatora "for" bez podawania jego definicji
> (czego w C zresztą i tak nie dałoby się zrobić).
>
> Gdyby korzystać z gotowych funkcji, i nie chcieć definiować np.
> square, to (zakładając dostępność funkcji isPrime) cały program
> wyglądałby tak:
>
> foldr (+) 0 (map (^2) (take 7 (filter isPrime [2 ..])))
>
to juz lepiej... w ym widze jakis wiekszy sens
trzebbylo zaczac od tego, bo trzeba przyznac ze kolegi zdolnosci tlumaczenia spraw
przypominaja zdolnosci tlumaczacego-inwalidy
kolega moze tgo nie widzi ale to powoduje ze ja np rozumiem reakcje ludzi na to co
wuglada jako strumien bzdetów dlatego ze jest zle pisane (zamiast podwac fakty
kluczowe i prosto kolega wypisuje te niektuczowe w inwalidzki sposob i predzej mozna
sie nabawic urazy do jezykow funkcyjnych czytajac to niz przeciwnie
- bo pamietam kiedys sam zajrzalem na jakis tutorial do lispa i nie wygladalo to tak
zle jak w wydaniu kolegi, tyle ze czego tam sie nauczylem i tak w czesci zapomnielem)
> Warto przy tej okazji powiedzieć nieco o rodzinie funkcji fold.
> Zasadnicza idea jest taka, że
>
> fold (*) [a,b,c,d] = a * b * c * d
>
> Jednak powyższe sformułowanie jest niejednoznaczne, bo prawą
> stronę można interpretować jako
>
> (a * (b * (c * d)))
>
> albo jako
>
> (((a * b) * c) * d)
>
> albo jako
>
> ((a * b) * (c * d))
>
> W praktyce Haskell daje dwie funkcje, foldl i foldr, które
> działają w taki sposób:
>
> foldl (*) e [a,b,c,d] = (((e * a) * b) * c) * d
> foldr (*) e [a,b,c,d] = a * (b * (c * (d * e)))
>
> Dodatkowy parametr e sprawia, że funkcje mają sensowną wartość
> również dla listy pustej, i rozluźnia nieco wymagania narzucane
> na operator (*).
>
> (Oczywiście, (*) niekoniecznie oznacza tutaj mnożenie, ale
> dowolny operator dwuargumentowy)
>
> > a w to ze to bedzie tak szybkie tez nie do konca wierze
>
> Informatyka to nie jest religia. Jak w coś nie wierzysz, to możesz
alez debilna wypowiedz... kolega powinien uwazac bo czasami osiaga poziom quelqebuga
czy innego talatajstwa a na tym poziomie ja nie moge rozmawiac
religie nie jest oparta na niewierzeniu,
religie jest oparta na wierze; to pierwsze to wrecz cos dokladnie przeciwnego i jest
to raczej wyraz sceptyzyzmu wobec wiary... jesli kolredze sie trafiaja takie babole w
wypowiedziach
to ostroznosc wobec przyjomania tych tekstow choc i tak wygladaja one nieco
podejrzanie jako rozumny przekaz staje sie tym bardziej uzasadniona... i ogolnei
zachodzi pytanie czy kolega bardzij mowi z sensem czy bardziej truje ludzi
bulszitem... (najprawdopodobniej jest to pewien mix ale z miksami bywa tak ze
domieszka bulshitu moze powodowac ze czytanie calosci jest bardziej stratnie niz
korzystne ;c)
ogolnie nietstsy rozmawianie z takimi ludzmi jest dosyc tragiczne
> sprawdzić. (Tzn. ściśle rzecz biorąc pewnie nie będzie "tak szybkie",
> bo Haskellowy runtime ma jakieś tam dodatkowe narzuty)
>
> > przydaloby sie jednak by bylo choc prostsze a nie wyglada
>
> Moim zdaniem jest tak proste, jak tylko się da.
>
> > sam ten kod w c chyab w sumie mozna napisac prsciej
> >
> >
> > int PoliczSumeParuPoczatkowychLiczbPierwszych(int ilu)
> > {
> > int i = 0, dodano = 0, suma = 0;
> >
> > for(;;)
> > if(jest_liczba_pierwsza(++i))
> > {
> > suma += i*i ;
> > if(++dodano==ilu) return suma;
> > }
> > }
>
> Dla mnie nie jest to ani trochę prostsze od poprzedniej wersji.
no cos, mogłbym wspolczuc ale mi sie nie chce... obecnie zastanawiam sie czy kolega
ma jakas dysfunkcje mozgu i poprostu lubi lispa czy tez moze nauka lispa wywolala ta
dysfunkcje czy cos w tym stylu
samo to w sobie nie bylo by takie zle ale jesli kolega czestuje ta dysfunkcjonalnosci
ainnych to juz jest pewien trolling (tak to nazwijmy, nie uzwywam zbyt dopasowanych
okreslen bo
nie che tracic czasu na te glupie gadki)
normalny czlowiek moim zdaniem nie powinien miec problemow z rozumieniem na czym
polega c,
zgadza sie ze jezyk c jest w pewnym sensie kryptyczny i ze w pewnym sensie jest to
zle... kwestia jest jednak tak ze
c powstal przy okreslonych zalozeniach,
c nie tylko ma wyrazac zapis jakiegos tam taska do wykonania ale umozliwic zapis w
sposob odwolujacy sie do pewnego typu elementarnych operacji natywnych dla maszyny (o
czym chyba kazdy powinien wiedziec) i w tym sensie taki programik
jak wyzej jest naprawde lekki jest to pare instrukcji asemblera na krzyz, wyrazone w
postaci programu w c
c jest wlasnie do tego i tutaj lisp nie ma z c szans
zaznaczam ze do lispa nic nie mam, mam problem jednak z chrzanieniem - kolaga ma
powazny z tym problem, bierze jakas tematyke i zmieni ja w chrzanienie zamiast jednak
psiac o tym duzo bardziej normalnie ;c
sama ta linijka
> foldr (+) 0 (map (^2) (take 7 (filter isPrime [2 ..])))
jest ok, coz moge powiedziec jest to jedna z mozliwych opcji budowania jezyka
skryptowego, ktora ma zapewne w pewnych tematach rzeczywiste zalety, w innych inne
podejscia raczej by to przebily
oolenie to ta linijka przypomina troche skladanie i kombinowanie programow z jakiegos
basha (lub specyficzny sposob skladanie procedur jedna z druga:
innymi slowy przypomina to troche specyficzny pionowy sposob pisania
pewnych kawalkow w c
typu
x = limit(7)
l = primes(l)
l = square(l)
z = sum(l)
ew s = sum(square(primes(limit(7))))
tylko wyrazony poziomo i generalizowany (byc moze w ciakawy sposob, tj ktos tam
odwalil troche roboty by to podefiniowac),
nie mam nic do tego ale chrzanienie zbudowane dookola tego to nie jest dobra rzecz
Następne wpisy z tego wątku
- 04.01.19 13:47 fir
- 04.01.19 13:52 g...@g...com
- 04.01.19 14:01 fir
- 04.01.19 14:12 g...@g...com
- 04.01.19 14:15 AK
- 04.01.19 14:16 fir
- 04.01.19 14:26 fir
- 04.01.19 14:31 AK
- 04.01.19 14:33 fir
- 04.01.19 14:50 AK
- 04.01.19 14:54 fir
- 04.01.19 15:10 fir
- 04.01.19 15:42 g...@g...com
- 04.01.19 16:33 fir
- 04.01.19 16:35 fir
Najnowsze wątki z tej grupy
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
- Młodzi programiści i tajna policja
Najnowsze wątki
- 2024-12-21 jak tacy debile
- 2024-12-20 Precedensy politycznie motywowanego nie wydawania w UE
- 2024-12-20 Obrońcy
- 2024-12-20 Obrońcy
- 2024-12-20 Obrońcy
- 2024-12-20 Gdańsk => Inżynier bezpieczeństwa aplikacji <=
- 2024-12-20 czyste powietrze
- 2024-12-20 Katowice => Analyst in the Trade Development department (experience wi
- 2024-12-20 Opole => Inżynier Serwisu Sprzętu Medycznego <=
- 2024-12-20 Katowice => Regionalny Kierownik Sprzedaży (OZE) <=
- 2024-12-20 Rzeszów => International Freight Forwarder <=
- 2024-12-20 Katowice => Key Account Manager (ERP) <=
- 2024-12-20 Ekstradycja
- 2024-12-20 Mikroskop 3D
- 2024-12-20 Warszawa => Spedytor Międzynarodowy <=