вторник, 21 сентября 2010 г.

Точечное расстройство

Обнаружил в интернете простенький однострочник на F#. И сразу же подумал, а почему бы не попробовать написать тот-же пример в бесточечном стиле. Вначале погуглил на тему как делать композиции в F#. Оказалось довольно просто:
> (>>);;
val it : (('a -> 'b) -> ('b -> 'c) -> 'a -> 'c)

то есть (f >> g) x на самом деле g(f(x)) и

> (<<);;
val it : (('a -> 'b) -> ('c -> 'a) -> 'c -> 'b)

что преобразует (f << g) x в f(g(x))

Вроде всё просто и понятно. Пишем код.
let sorted = Seq.forall (fun (a,b) -> a <= b) << Seq.pairwise

Не катит, код сообщения такой.
Value restriction. The value 'sorted' has been inferred to have generic type val sorted : ('_a -> bool) when '_a :> seq<'_b> and '_b : comparison Either make the arguments to 'sorted' explicit or, if you do not intend for it to be generic, add a type annotation.

Зато всё превосходно работает вот так:
let sorted xs= Seq.forall (fun (a,b) -> a <= b) << Seq.pairwise <| xs

Данный факт меня крайне расстроил. Я не знаю как записать выражение в бесточечном стиле. Надеюсь что всё-таки я верблюд и чего-то не понимаю.