Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Func<T1,Func<T2,TResult>> Curry(this Func<T1, T2, TResult> f)
{
return a=>b=>f(a,b);
}
<pre/>
А вывод типов (хоть и ущербный) есть и в C#.let rec zip la lb = match (la, lb) with | (ha::ta), (hb::tb) -> (ha, hb) :: (zipWith func ta tb) | _ -> []
FList<Tuple<A,B>> Zip<A,B>(FList<A> la, FList<B> lb)
{
return la.Match(
() => FList<Tuple<A,B>>.Empty,
(ha, ta) => lb.Match(
() => FList<Tuple<A,B>>.Empty,
(hb, tb) => Tuple.New(ha, hb).Cons(Zip(la, lb))));
}
type 'a 'b optfun =
| Konst of 'b
| Fun of ('a -> 'b)
...
let x = Konst 0
abstract public class OptFun<A,B> {
public sealed class Konst {
B Value {get; private set;}
public Konst(B value) { Value = value; }
}
public sealed class Fun {
Func<A,B> Func {get; private set;}
public Konst(Func<A,B> func) { Func = func; }
}
// реализацию Equals, ==, !=, и GetHashCode добавьте сами
}
...
OptFun<int, int> x = new OptFun<int, int>.Konst(0)
// или в лучшем случае
var x = OptFun.Konst(0)
[Перевод] Я все еще не просек F#