Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: BoneFlute 11. 07. 2018, 01:46:40

Název: Syntaxe Haskell funkce
Přispěvatel: BoneFlute 11. 07. 2018, 01:46:40
Ahoj.

Mějme funkci (třeba v Haskellu):

Kód: [Vybrat]
foo a = a + 1
Existuje nějaký zajímavý důvod, proč je ten argument před rovnítkem?

Mám totiž takovouto úvahu:
Pokud symbolu přiřazuju hodnotu:
Kód: [Vybrat]
a = 1
b = "text"
c = True
tak v případě funkce přiřazuju lambdu:
Kód: [Vybrat]
foo = \a -> a + 1
Díky za odpovědi.
Název: Re:Syntaxe Haskell funkce
Přispěvatel: balki 11. 07. 2018, 06:45:05
Ja sa pridam otazkou, ako sa robi nad definiciami funkcie cez lambdu pattern matching?

(To '=' mi tiez prijde, ze je to len na zmatenie nepriatela, ale haskellisti budu mat asi dobry dovod na takyto syntakticky cukor)
Název: Re:Syntaxe Haskell funkce
Přispěvatel: Inkvizitor 11. 07. 2018, 07:09:29
Ahoj.

Mějme funkci (třeba v Haskellu):

Kód: [Vybrat]
foo a = a + 1
Existuje nějaký zajímavý důvod, proč je ten argument před rovnítkem?

Mám totiž takovouto úvahu:
Pokud symbolu přiřazuju hodnotu:
Kód: [Vybrat]
a = 1
b = "text"
c = True
tak v případě funkce přiřazuju lambdu:
Kód: [Vybrat]
foo = \a -> a + 1
Díky za odpovědi.

Nevim, jestli rozumim, o co Ti jde. Ale klic podle me je v tom, co pises dole

a = 1
b x = x
c x y = x + y

V Haskellu nejsou zvlast konstanty a funkce. Haskellovsky program je reseni soustavy rovnic. Prava a leva strana rovnice, to je podle me klic k vysvetleni.
Název: Re:Syntaxe Haskell funkce
Přispěvatel: v 11. 07. 2018, 07:52:01
Ja sa pridam otazkou, ako sa robi nad definiciami funkcie cez lambdu pattern matching?

(To '=' mi tiez prijde, ze je to len na zmatenie nepriatela, ale haskellisti budu mat asi dobry dovod na takyto syntakticky cukor)
buď
Kód: [Vybrat]
\x -> case x of .. a nebo s -XLambdaCase
Kód: [Vybrat]
\case
    1 -> ...
    2 -> ...
Název: Re:Syntaxe Haskell funkce
Přispěvatel: v 11. 07. 2018, 07:56:30
nemám na to rozumnou odpověď, ale fakt bych nechtěl muset psát tím druhým způsobem, takže tipuju, že v tom hraje roli ergonomie
Název: Re:Syntaxe Haskell funkce
Přispěvatel: listoper 11. 07. 2018, 08:33:41
Existuje nějaký zajímavý důvod, proč je ten argument před rovnítkem?

Zajimavy to asi neni, ale podle me je duvodem podobnost s matematickym zapisem.
Kód: [Vybrat]
f(x) = x + 1

Cte se to jako "Funkce 'f' jedne promenne x ...".


Název: Re:Syntaxe Haskell funkce
Přispěvatel: hlawolam 11. 07. 2018, 11:56:14
Neni lepší jít touhle cestou ?
Kód: [Vybrat]
((.)(.) :: (have'' -> boobs'') -> (in' -> haskell'))
Název: Re:Syntaxe Haskell funkce
Přispěvatel: Géomètre 11. 07. 2018, 12:11:03
Je to jako v matematice, f(x)=něco(x) je to samé, co f=λx.něco(x). Při psaní kódu je to kratší a přehlednější. Žádná věda v tom není.
Název: Re:Syntaxe Haskell funkce
Přispěvatel: balki 11. 07. 2018, 14:46:04
Ja sa pridam otazkou, ako sa robi nad definiciami funkcie cez lambdu pattern matching?

(To '=' mi tiez prijde, ze je to len na zmatenie nepriatela, ale haskellisti budu mat asi dobry dovod na takyto syntakticky cukor)
buď
Kód: [Vybrat]
\x -> case x of .. a nebo s -XLambdaCase
Kód: [Vybrat]
\case
    1 -> ...
    2 -> ...

Dakujem :)
Název: Re:Syntaxe Haskell funkce
Přispěvatel: BoneFlute 11. 07. 2018, 14:57:43
Haskellovsky program je reseni soustavy rovnic. Prava a leva strana rovnice, to je podle me klic k vysvetleni.
Díky.
Název: Re:Syntaxe Haskell funkce
Přispěvatel: BoneFlute 11. 07. 2018, 14:58:40
ale fakt bych nechtěl muset psát tím druhým způsobem
Proč?
Název: Re:Syntaxe Haskell funkce
Přispěvatel: v 11. 07. 2018, 15:11:49
ale fakt bych nechtěl muset psát tím druhým způsobem
Proč?
pohodlí - bylo by to delší, ošklivější a pattern matching na více argumentech by byl takový divný
Název: Re:Syntaxe Haskell funkce
Přispěvatel: BoneFlute 11. 07. 2018, 15:25:43
ale fakt bych nechtěl muset psát tím druhým způsobem
Proč?
pohodlí - bylo by to delší, ošklivější a pattern matching na více argumentech by byl takový divný

Kód: [Vybrat]
foo x = x + 1versus
Kód: [Vybrat]
foo = x -> x + 1Ano, přísně vzato je to o kousek delší.

Kód: [Vybrat]
foo (x:xs) = [(x + 1) : (foo xs)]versus
Kód: [Vybrat]
foo = (x:xs) -> [(x + 1) : (foo xs)]pattern matching IMHO pohoda, divnost nevidím - možná ukaž příklad

Co je ošklivější je obávám se otázka zvyku. Mě přijde "ošklivá" ta nekonzistence, že přiřazení hodnoty se děje jinak, než přiřazení funkce.
Název: Re:Syntaxe Haskell funkce
Přispěvatel: Swan 11. 07. 2018, 15:27:04
ale fakt bych nechtěl muset psát tím druhým způsobem
Proč?
Je to pro masochisty, viz CPL.
Název: Re:Syntaxe Haskell funkce
Přispěvatel: v 11. 07. 2018, 15:35:56
na více než jednom argumentu
Kód: [Vybrat]
f (x:xs) (y:ys) = ...
f _ _ = ...
vs.
Kód: [Vybrat]
f = \a b -> case (a, b) of ...
Název: Re:Syntaxe Haskell funkce
Přispěvatel: BoneFlute 11. 07. 2018, 16:04:47
na více než jednom argumentu
Kód: [Vybrat]
f (x:xs) (y:ys) = ...
f _ _ = ...
vs.
Kód: [Vybrat]
f = \a b -> case (a, b) of ...
Rozumím. Takže když by to bylo takto?
Kód: [Vybrat]
f = (x:xs) (y:ys) -> ...
Název: Re:Syntaxe Haskell funkce
Přispěvatel: mm 11. 07. 2018, 17:24:19
najdi si na wiki co je to Eta redukce
a neco o lambda funkcich

jinak https://wiki.haskell.org/Eta_conversion

takze tve:

Kód: [Vybrat]
f a = a + 1
je plne equivaletni k:

Kód: [Vybrat]
f = (+) 1
Název: Re:Syntaxe Haskell funkce
Přispěvatel: v 11. 07. 2018, 17:46:13
na více než jednom argumentu
Kód: [Vybrat]
f (x:xs) (y:ys) = ...
f _ _ = ...
vs.
Kód: [Vybrat]
f = \a b -> case (a, b) of ...
Rozumím. Takže když by to bylo takto?
Kód: [Vybrat]
f = (x:xs) (y:ys) -> ...
tak bych řekl, že současný stav je mi milejší :D konzistentnost je fajn, ale ergonomie je pro mě víc - a konzistentnost na ni může mít jak pozitivní tak i negativní vliv
Název: Re:Syntaxe Haskell funkce
Přispěvatel: BoneFlute 11. 07. 2018, 19:55:30
tak bych řekl, že současný stav je mi milejší :D konzistentnost je fajn, ale ergonomie je pro mě víc - a konzistentnost na ni může mít jak pozitivní tak i negativní vliv

V čem vidíš tu ergonomii?
Název: Re:Syntaxe Haskell funkce
Přispěvatel: BoneFlute 11. 07. 2018, 19:56:30
najdi si na wiki co je to Eta redukce
a neco o lambda funkcich

jinak https://wiki.haskell.org/Eta_conversion

takze tve:

Kód: [Vybrat]
f a = a + 1
je plne equivaletni k:

Kód: [Vybrat]
f = (+) 1
Ah, znám, ale nedošlo mi. Jasný, díky.
Název: Re:Syntaxe Haskell funkce
Přispěvatel: v 11. 07. 2018, 21:29:37
tak bych řekl, že současný stav je mi milejší :D konzistentnost je fajn, ale ergonomie je pro mě víc - a konzistentnost na ni může mít jak pozitivní tak i negativní vliv

V čem vidíš tu ergonomii?
viz tady
dále ta syntaxe co jste navrhoval by asi vyžadovala dvojité odsazení v případě pattern matchingu
Kód: [Vybrat]
f =
  \.. ->
    ...
  \... ->
    ...
a vůbec, myslím, že se v tom zbytečně moc vrtáte :)