Re[4]: Вопрос к Vlad2: Nemerle & R#
От: Vermicious Knid  
Дата: 25.03.06 10:59
Оценка: 74 (4)
Здравствуйте, z00n, Вы писали:

Z>В Scheme, CL и даже Javascript карринг, разумеется, есть:

Z>
Z>;; Scheme
Z>(define curry
Z>  (lambda (f)
Z>    (lambda (x)
Z>      (lambda (y) (f x y)))))

Z>(define positive? ((curry <) 0))
Z>(define add-42    ((curry +) 42))
Z>


Такой "карринг" конечно есть и в Nemerle. Можно практически переписать вышеприведенный код один-в-один, но так как язык статически типизированный он будет работать только с функциями одного типа. Но можно использовать дженерики:
def curry[X,Y,R](f : X * Y -> R)
{
    fun(x : X) { fun(y : Y) { f(x, y) } }
}

def add_42 = add(_ + _)(42);
def positive = curry(_ < _)(0);


А речь разумеется о синтаксическом сахаре для currying, который есть в ML и Haskell. Там можно написать нечто вроде add42 = (+) 42. В Nemerle так нельзя, но можно так:
def add42 = 42 + _; // или _ + 42
def positive = 0 < _; // или _ > 0

На мой взгляд это ничем не хуже, а в определенных случаях даже лучше. Но название и суть несколько другие.

Z>Странно, но я прочитав "Grokking Nemerle" — так и не смог грокнуть насколько функции first-class, а насколько это все макросы Просветите меня.


Макросы здесь вообще не причем, а функции естественно first-class. Странный вопрос вообще...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.