вторник, 28 декабря 2010 г.

Композиция функций и странные баги

Начал потихоньку вникать в теорию комбинаторов и решил попробовать их реализовать на F#.

Но наткнулся на один странный баг, который не смог воспроизвести дома. А именно, есть комбинатор функций a, b:

let (|>>) a b =
    fun x -> a x |> b

Так вот, используя интерпритатор F# из плагина к VS2008 я не мог построить комбинацию скажем таких функций:

let f1 x = x + 1
let f2 x = x.ToString()
 
Интерпритатор ругался и просил явно прописать типы.
хотя для
let f1 x = x + 1
let f2 x = x * x
 
или
 
let f2 x = (float) x + 1.0
 
комбинатор работал.
 
А вот дома, в VS2010 всё заработало в точности так, как и ожидалось.


Следующий код:

let (|>>) a b =
    fun x -> a x |> b
 
let f1 x = x + 1
let f2 x = (float) x + 1.0
let f3 x = [x]
 
let f' = f1 |>> f2 |>> f3
 
f' 10
 
выдал:
val ( |>> ) : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c
val f1 : int -> int
val f2 : int -> float
val f3 : 'a -> 'a list
val f' : (int -> float list)

> f' 10;;
val it : float list = [12.0] 
т.е. возможно есть какие-то проблемы с комбинаторами в старых версиях F#.
Но точно посмотреть версию F# на работе смогу только после НГ...
Всех с наступающим!)) 

Комментариев нет:

Отправить комментарий