eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingJaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
  • 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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: