рдореБрдЭреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмреЗрд╡рдХреВрдл рдордд рдмрдирд╛рдУ

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдХреЛрдб рдЕрд░реНрдердХрддрд╛, 100% рд╢реБрджреНрдзрддрд╛, рд╕рдорд░реНрдерди рдореЗрдВ рдЖрд╕рд╛рдиреА рдФрд░ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рдирд╡рд╛рдЧрдВрддреБрдХреЛрдВ рдХреЛ рд▓реБрднрд╛рдирд╛ рдкрд╕рдВрдж рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдЙрдЪреНрдЪрддрдо рдкреНрд░рджрд░реНрд╢рди рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рднреА рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрдард┐рди рдХрд╛рдо рд╣реИ, рдФрд░ "рдЬрд╛рджреВ рдХреА рдЧреЛрд▓рд┐рдпрд╛рдБ" рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рджреВрд╕рд░реА рдУрд░, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдХреЗ рддрддреНрд╡ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрд╡рд┐рдлреНрдЯ рдФрд░ рдХреЛрдЯрд▓рд┐рди рдЬреИрд╕реА рдФрджреНрдпреЛрдЧрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдЗрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЗрд╕реЗ "рдЫреЛрдЯреЗ" рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ, рдХрдИ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рднреА рдирд╣реАрдВ, рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреЗред рджреВрд░ - рдПрдлрдЖрдИ рдХреЗ рдЕрдзрд┐рдХ рднрд╛рдЧреЛрдВ рдХреЛ рдФрджреНрдпреЛрдЧрд┐рдХ рдкрд░рдорд╛рдгреБ рд╣рдерд┐рдпрд╛рд░реЛрдВ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмреЗрд╣рддрд░ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдФрд░ рдЕрдм рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ!


рд╡рд┐рдЯрд╛рд▓реА рдмреНрд░реИрдЧрд┐рд▓реНрд╡рд╕реНрдХреА , рдПрдлрдкреА рдХреЗ рдПрдХ рд╢рд┐рдХреНрд╖рдХ, рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдЧрдгрдирд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд, "рд╣рд╛рд╕реНрдХреЗрд▓ рдЗрди рдбреЗрдкреНрде" рдкреБрд╕реНрддрдХ рдХреЗ рд▓реЗрдЦрдХ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ 2020 рд╕рдорд┐рддрд┐рдпреЛрдВ рдХреЗ рд╕рджрд╕реНрдп рдФрд░ рдЬреАрдПрдЪрд╕реА рд╕рдВрдХрд▓рдХ рдХреА рдкрд░реНрдпрд╡реЗрдХреНрд╖реА рд╕рдорд┐рддрд┐ рд╣реИред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЗрддрд┐рд╣рд╛рд╕


рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╣рд╛рдирд┐рдпрд╛рдВ рд╣рдореЗрд╢рд╛ рд╕рдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред рдЕрдХреНрд╕рд░ рд▓реЛрдЧ рдПрдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

тАЬрдПрдХ рдмрд╛рд░ рдПрдХ рджреВрд░, рдмрд╣реБрдд рджреВрд░ рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рд░рд▓, рд╕реАрдзреА рдФрд░ рдЕрдЪреНрдЫреА рдереАред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХреНрд░рдорд╛рджреЗрд╢рд┐рдд рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ - рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ!

рддрдм рд╕рд┐рде рдбрд░рд╛рд╡рдиреЗ рд▓реЛрдЧ рдЖрдП рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: '' рд╕рднреА рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ! рдРрд╕реЗ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣реА рд╕рдмрдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред ''

рдЬрдм рдЙрдиреНрд╣реЛрдВрдиреЗ рддрд╛рдХрдд рд╣рд╛рд╕рд┐рд▓ рдХреА, рддреЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ - рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреАрдВред рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдкреАрдбрд╝рд┐рдд рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣реИред "

рдореЛрдХреНрд╖ рдореЗрдВ рдореБрдЦреНрдп рдмрд╛рдд рдПрдХ рд╕реБрдВрджрд░ рдФрд░ рдЕрд░реНрдерд╣реАрди рддрд╕реНрд╡реАрд░ рдЦреАрдВрдЪрдирд╛ рд╣реИред



рдЬрдм рдЖрдк рдЪрд┐рддреНрд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЦреБрд╢реА, рд╢рд╛рдВрддрд┐ рдФрд░ рд╢рд╛рдВрддрд┐ рдЖ рдЬрд╛рдПрдЧреА, рдФрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдХрд╣рд╛рдиреА рд╕реБрдВрджрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореИрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдФрд░ рдФрджреНрдпреЛрдЧрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реВрдВред



рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдлреИрд░рд╛рдбреЗ рдХреА рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рд╣реИ - рдЙрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЬрдиреНрдорд╕реНрдерд╛рди рдЬреЛ рддрдм рдФрджреНрдпреЛрдЧрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред

рдФрджреНрдпреЛрдЧрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╛рддрдЪреАрдд рдореЗрдВ, рдХрд┐ рд╡реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдХрд┐ рд╡реЗ рдПрдлрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдХреЛ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП!

рдПрдлрдкреА рдХрд╛ рдореБрдЦреНрдп рдорд┐рд╢рди рдЕрдЪреНрдЫреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдореБрдЦреНрдпрдзрд╛рд░рд╛ рдХреА рднрд╛рд╖рд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪрд╛рдирд╛ рд╣реИред

рд╕рднреА рдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреЛ рдлреИрд░рд╛рдбреЗ рдЬреИрд╕реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ - рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмрд┐рдЬрд▓реА рдкрд░ рдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред

рдЬреЙрди рдореИрдХрд╛рд░реНрдереА рд╕рдорд╛рд░реЛрд╣


рдЬреЙрди рдореИрдХрд╛рд░реНрдереА рд▓рд┐рд╕реНрдк рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред



рдлреЛрд░рдЯреНрд░рд╛рди 65 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдереАред рдЗрд╕рдХрд╛ рдПрдХ рд╕рд╢рд░реНрдд рд╡рд┐рд╡рд░рдг рд╣реИ:

        IF (I.NE.0) GOTO 40
        STMT-1
        STMT-2
40      STMT-3

I 0, ┬л40┬╗. 

, , . , XIF(M, N1,N2), , : N1 N2.

: ┬лтАж ┬╗ , .

тАФ N1 N2. , ?

:

M==0 ? N1 : N2

. . , , - .

?


тАФ . 1977 . ┬л ?┬╗. тАФ тАФ , .



тАФ , .

- :

c := 0 
for i := 1 step 1 until n do
    c := c + a[i]*b[i]

тАФ .

. FP.

Def DotP = (Insert +) o (ApplyToAll x) o Transpose

тАФ o, , , .

тАФ тАФ , , .

. .


, - Java . , , , .



, , :

  • , ;
  • ;
  • ;
  • .

, .


:

fun countLinesInFiles(fnames: List<String>): Int
    = fnames.map { File(it).readLines().size }
        .sum()

Kotlin, , . ?

, , . тАФ ┬лmap┬╗ тАФ . , : , . it тАФ . тАФ sum().

, map Kotlin, , . , . тАФ readLines .

Haskell


, Haskell.

countLines :: FilePath -> IO Int
countLines = fmap (length . lines) . readFile 

countLinesInFiles :: [FilePath] -> IO Int
countLinesInFiles = fmap sum . traverse countLines

, , . Haskell , , .

. , : , Int тАФ . 

. ┬лIO┬╗, Haskell , -. ┬л ┬╗, Int, IO Int. , .

. тАФ Haskell. тАФ FilePath, IO Int тАФ . : , traverse тАФ , ┬лcountLines┬╗.

. ┬л. ┬╗ ( o) тАФ . , .

┬лf. g┬╗ тАФ , ┬лx┬╗ ┬лf(g(x))┬╗. , . , . .


.

, , . тАФ , .

UML-. : , , , , .



Swift


, , - . Swift , , .

protocol Shape {
    func area() -> Double
    func diameter() -> Double
}

class Circle: Shape {
    var r = 0.0
    init(radius: Double) {
        r = radius
    }
    func area() -> Double {
        return 3.14 * r * r
    }
    func diameter() -> Double {
        return 2 * r
    }
}

class Square: Shape {
    var s = 0.0
    init(size: Double) {
        s = size
    }
    func area() -> Double {
        return s * s
    }
    func diameter() -> Double {
        return sqrt(2) * s
    }
}

, .

: , , тАУ , . .

, , .

func testShape(shape: Shape) {
    print(shape.area())
    print(shape.diameter())
}

. .

testShape(shape: Circle(radius: 5))
testShape(shape: Square(size: 5))

78.5
10.0
25.0
7.0710678118654755

, , , , - . тАУ , .

Haskell


Haskell, , Swift.

data Shape = Circle Double | Square Double

area :: Shape -> Double
area (Circle r) = 3.14 * r * r
area (Square s) = s * s

diameter :: Shape -> Double
diameter (Circle r) = 2* r
diameter (Square s) = sqrt 2 * s

. , ┬л ┬╗ тАФ . ┬л┬╗ . .

тАФ , , . Haskell тАФ . , .

:

> area (Circle 5)
78.5
> diameter (Circle 5)
10.0
> area (Square 5)
25.0
 diameter (Square 5)
7.0710678118654755

тАФ тАФ , .

, Swift Haskell . , , , . , , тАФ , тАФ , , .
CircleSquare
area**
diameter**
тАФ , тАФ . тАФ , .

, : ? . .

, :

  • тАФ ;
  • тАФ , , , .

тАФ .


, Swift.

HaskellтАж

data Shape = Circle Double | Square Double

тАж Swift .

enum Shape { 
    case Circle(radius: Double) 
    case Square(size: Double)
}

. ┬л┬╗ , Swift ┬лenum┬╗, . , .

HaskellтАж

area :: Shape -> Double 
    area (Circle r) = 3.14 * r * r 
    area (Square s) = s * s

тАж Swift .

extension Shape {
    var area: Double {
        switch self {
            case .Circle(let r): return 3.14 * r * r 
            case .Square(let s): return s * s
        }
    }
}

, тАФ .

Kotlin:

sealed class Shape {
    data class Circle(val radius: Double): Shape() 
    data class Square(val size: Double): Shape()
}
fun area(sh: Shape): Double {
    return when (sh) {
        is Shape.Circle -> 3.14 * sh.radius * sh.radius 
        is Shape.Square -> sh.size * sh.size 
    }
}

, тАФ .

, Kotlin Swift ? , , , . , -, .


. , , , , , .
CircleSquarex
area**?
diameter**?
f???

, , , - тАФ . . : тАФ . , , .
CircleSquarex
area**+ ()
diameter**+ ()
f+ ()+ ()?

. .

. . тАФ - , тАФ , . тАФ .


тАФ тАФ . 20 , .

  • ┬лVisitor┬╗. , , . , . 
  • .
  • тАФ .
  • .
  • .

, ┬л ┬╗, . . , тАФ , .


, .

, : , , , . , .



Haskell. , , , ┬л┬╗ ?

, ┬л┬╗ тАФ .

тАФ ┬лComposite┬╗. . , .

, Kotlin тАФ .

val a = "Hello " 
val b = "world"
val c = a + b

, : ┬л, ? ┬╗. , тАФ - .

тАФ HTTP-. Kotlin :

val a = HttpReq("f","v1") 
val b = HttpReq("f2","v2")
val c = a + b

Haskell , . HTTP- тАФ . HTTP-. 

. . - . тАФ , тАФ , . ┬лoptional chaining┬╗, , Swift.

if let johnsStreet = john.residence?.address?.street
{ /* SUCCESS */ } else { /* FAILURE */ }

, . ┬лjohn┬╗ тАФ .

  • ?. , , false. 
  • , .
  • .
  • тАФ .

: , , . тАФ . , else тАФ . .

Swift . , , , : .

Haskell, .

case residence john >>= address >>= street of
    Just johnsStreet -> -- SUCCESS
    Nothing -> -- FAILURE

,  ┬л>>=┬╗ тАФ . .

Swift ┬лoptional chaining┬╗ . Kotlin . Haskell , ┬л>>=┬╗. 

:

  • , , .
  • , Haskell.

. . , . , тАФ , .

, тАФ .

┬л┬╗ . тАФ , . ┬л┬╗, . ┬л ┬╗ .

тАФ ?


. , тАФ .

, тАФ . Haskell ┬лBuild Systems a la Carte┬╗ . Distinguished Paper Award International Conference on Functional Programming (ICFP) - 2018 . Build-, .

Build- Build- тАФ . .

data Store i k v

:

  • i тАФ ;
  • k тАФ , , ;
  • v тАФ , , , .

тАФ . тАФ , . . 

. , , . , - -, , .

тАФ ┬лTask┬╗ тАФ .

newtype Task c k v = Task { run :: forall f. c f => (k -> f v) -> f v }

Haskell, . , тАФ ┬лf┬╗, . , .

? ┬лk -> fv┬╗ тАФ - . . . Build-.

тАФ :

type Tasks c k v = k -> Maybe (Task c k v) 

, , . ┬лMaybe┬╗ тАФ - ┬лoptional┬╗. , - - , .

Build-:

type Build c i k v = Tasks c k v -> k -> Store i k v
    -> Store i k v

. k, . тАФ . , .

.

  • Make,
  • Shake тАФ Make Haskell,
  • Bazel,
  • Excel.

. тАФ Excel тАФ . Excel тАФ . , - . Make Excel - , .

тАФ


.

тАФ Haskell . , .

, . - тАФ . , , . , .


, Haskell:

h :: [a] -> Int
h = length . filter p . map g . map f

тАФ . - , :

  • map f тАФ f;
  • map g тАФ g;
  • filter p тАФ : , , ;
  • length тАФ тАФ .

:

тАФ , , тАж ! !

, .

Fusion


┬лfusion┬╗, . 

┬лfusion┬╗? -: :

c := 0
foreach (x : xs)
    if p(g(f(x)))
        then c := c + 1

, (!), (!). , , 2-3 .

, , , . тАФ .

, .

GPU? !


Haskell, :

dotp :: Acc (Vector Float) -> Acc (Vector Float) -> Acc (Scalar Float) 
dotp xs ys = fold (+) 0 (zipWith (*) xs ys)

, Haskell: 2 , , . , Haskell GPU. GPU, : CUDA, Open CL тАФ , . Accelerate Haskell тАФ .

CUDA  100 , , . ! , . , .


тАФ . ? a, b, c D.

f :: A -> B -> C -> D
f a b c = ...

, тАФ . , :

  • f :: A -> B -> C -> D
  • f a :: B -> C -> D
  • f a b :: C -> D
  • f a b c :: D

, . , , - , . тАФ , , .

, , Scala -.

f :: A -> (B , C) -> D
f a p = тАж
    f :: A -> B -> C -> D
    f a :: (B, C) -> D
    f a p :: D

: ┬л , . , . , тАФ ┬╗. .

, .


. Haskell 15 QuickCheck, .

, , :

reverse :: String -> String
reverse = ...

, . , .

> quickCheck (\s -> reverse (reverse s) == s)
    +++ OK, passed 100 tests.

, . , 100, , , .

, , . . Haskell 15 . . , Swift Kotlin .


, ?

abs :: Int -> Int 
abs x = if x < 0 then 0 - x else x

head :: [a] -> a --      ! 
head (x:_) = x 

example :: Int -> Int
example x = if abs x < 0 then head [] else x

, .

head :: [a] -> a --      ! 
head (x:_) = x 

, head , тАФ .

┬лhead┬╗, ? , LiquidHaskell . LiquidHaskell тАФ Haskell-.

{-@ abs :: Int -> { n : Int | 0 <= n } @-} 
abs :: Int -> Int 
abs x = if x < 0 then 0 - x else x

{-@ head :: { xs : [a] | 1 <= len xs } -> a @-} 
head :: [a] -> a --      ! 
head (x:_) = x 

{-@ head :: { xs : [a] | 1 <= len xs } -> a @-} 
head :: [a] -> a --      ! 
head (x:_) = x 

, abs , n.

{-@ abs :: Int -> { n : Int | 0 <= n } @-} 
abs :: Int -> Int 
abs x = if x < 0 then 0 - x else x

, .

{-@ head :: { xs : [a] | 1 <= len xs } -> a @-} 
head :: [a] -> a --      ! 
head (x:_) = x 

, , . x x.

{-@ example :: x : Int -> { y : Int | x == y } @-} 
example :: Int -> Int
example x = if abs x < 0 then head [] else x

, . , . , - . - - , , Eiffel, - .

?


-:

type MyAPI = Get '[PlainText] String
    :<|> "conf" :> Get '[JSON] String
    :<|> "year" :> Get '[JSON] Int
    :<|> "like" :> Get '[JSON] Bool
myAPI :: Server MyAPI 
    = root :<|> year :<|> conf :<|> like

Haskell Servant, API . , url , , , JSON. , : String┬╗, Int┬╗, Bool.

.

root :: Handler String				
root = pure "Welcome to my REST API" 	
conf :: Handler String				
conf = pure "AppsConf"	   		
year :: Handler Int
year = pure 2019 conf
like :: Handler Bool
like = pure True

тАФ , .

, . , , . тАФ .


тАФ . , . .

тАФ ┬л Haskell┬╗. 2018 . , . Haskell. 600 , .

┬лHaskell in Depth┬╗ . , , . ┬лslbragilevsky┬╗ 42%.

Saint AppsConf , Introductory- , . , , . , iOS, Android, - тАФ . , , .

telegram-, .

Source: https://habr.com/ru/post/hi462505/


All Articles