Syntaxe Haskell funkce

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Syntaxe Haskell funkce
« kdy: 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.


balki

Re:Syntaxe Haskell funkce
« Odpověď #1 kdy: 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)

Inkvizitor

Re:Syntaxe Haskell funkce
« Odpověď #2 kdy: 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.

v

Re:Syntaxe Haskell funkce
« Odpověď #3 kdy: 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 -> ...

v

Re:Syntaxe Haskell funkce
« Odpověď #4 kdy: 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


Re:Syntaxe Haskell funkce
« Odpověď #5 kdy: 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 ...".



hlawolam

Re:Syntaxe Haskell funkce
« Odpověď #6 kdy: 11. 07. 2018, 11:56:14 »
Neni lepší jít touhle cestou ?
Kód: [Vybrat]
((.)(.) :: (have'' -> boobs'') -> (in' -> haskell'))

Géomètre

Re:Syntaxe Haskell funkce
« Odpověď #7 kdy: 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í.

balki

Re:Syntaxe Haskell funkce
« Odpověď #8 kdy: 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 :)

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Syntaxe Haskell funkce
« Odpověď #9 kdy: 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.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Syntaxe Haskell funkce
« Odpověď #10 kdy: 11. 07. 2018, 14:58:40 »
ale fakt bych nechtěl muset psát tím druhým způsobem
Proč?

v

Re:Syntaxe Haskell funkce
« Odpověď #11 kdy: 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ý

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Syntaxe Haskell funkce
« Odpověď #12 kdy: 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.

Swan

Re:Syntaxe Haskell funkce
« Odpověď #13 kdy: 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.

v

Re:Syntaxe Haskell funkce
« Odpověď #14 kdy: 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 ...