Re[9]: F#, вычисление дистанции между узлами дерева
От: varenikAA  
Дата: 19.08.19 09:58
Оценка:
Здравствуйте, Poopy Joe, Вы писали:

PJ>Здравствуйте, Mumitroller, Вы писали:


M>>Вроде бы достаточно очевидно — получится функция f с двумя аргументами, которая возвращает значение такого же типа, как и f1.


PJ>Что там очевидного? Ни имени аргументов, ни их порядка. В случае f# это может выглядеть как

PJ>let f a b c = fun a c -> ... или let f a b с = fun c a -> ...

Просто скажу, что без лишних ухищрений в F# возможен только первый вариант:


using System.Console;

def f1 (a, b, c) {
    a * b / c
};

def partialFunction1 =    f1 (10 , _ , _);
def partialFunction2 =    f1 (_ , 10, _);
def partialFunction3 =    f1 (_ , _ , 10);

def regularFunction (a, c) {
    f1 (a, 10, c)
};

В этом случае:
let f a b c = fun a c -> a + b + c

вероятно лямбда перекроет аргументы a и c и сможет использовать значение b.
Только зачем? ведь применение f к 3 аргументам создаст функцию с двумя аргументами (int -> int -> int).
Непонятно, однако.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: F#, вычисление дистанции между узлами дерева
От: Poopy Joe Бельгия  
Дата: 19.08.19 11:09
Оценка:
Здравствуйте, varenikAA, Вы писали:


AA>def partialFunction1 = f1 (10 , _ , _);

AA>def partialFunction2 = f1 (_ , 10, _);
AA>def partialFunction3 = f1 (_ , _ , 10);

AA>def regularFunction (a, c) {

AA> f1 (a, 10, c)
AA>};

Эээ... А в чем собственно разница между всеми этими вариантами? А наличии неявных аргументов? И что это дает в сравнении с явными?

AA>Только зачем? ведь применение f к 3 аргументам создаст функцию с двумя аргументами (int -> int -> int).

Понятия не имею, пример же сферический. Нет этих аргументов в момент использования, а есть только b, например.
Re[4]: F#, вычисление дистанции между узлами дерева
От: Poopy Joe Бельгия  
Дата: 19.08.19 12:52
Оценка: 9 (1)
Здравствуйте, varenikAA, Вы писали:

AA>синтаксис F# шикарен, тут я согласен, Nemerle конечно не хватает изящества, но он по-крайней мере описывает тип после имени, что уже ставить его наголову выше C#.

AA>Сравните:
AA>
AA>    let headers (lines : seq<string>) =
AA>        let printLine s = s |> fprintf out "%s\r\n"
AA>        lines |> Seq.iter printLine
AA>        printLine ""
AA>        out.Flush()
AA>


AA>и


AA>
AA>        def headers (lines) {
AA>            lines.Iter(ou.WriteLine);
AA>            ou.WriteLine("");
AA>            ou.Flush();
AA>        }

AA>


AA>Объективно, что лучше?


let headers lines  =
    lines |> Seq.iter (fprintfn out "%s") 
    fprintfn out ""
    out.Flush()

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.