Как заставить трубопроводную лямбду возвращать какое-то значение - PullRequest
1 голос
/ 08 декабря 2011

Трудно объяснить, вот что я хочу:

let internal (=%=) (W : int, thriller : Dev -> unit -> bool) =
    let id = get W
    if id <> -1 then
        workbase.[id] |> thriller

Это не позволяет моему триллеру возвращать любой тип.

Так что я могу сделать W =%= fun w -> foo() где foo() - это unit

Но как мне сделать W =%= fun w -> foo(), где foo() - это unit -> T' (некоторый тип)?

спасибо

только что добавил окончательное использование (потому что оно нравится):

let CanRead     W dev v = W =%= fun w -> w.GetCanRead dev v
                        |> fun opt -> if opt.IsSome then opt.Value
                                      else false

после комментария:

let CanRead     W dev v =   match W =%= fun w -> w.GetCanRead dev v with
                            | Some(t)   -> t
                            | None      -> false

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Ветвь else отсутствует.

Когда вы возвращаете unit в выражении if / else, if... then... является ярлыком для if... then... else (). Таким образом, вы всегда можете вернуть некоторый тип T в законченном выражении if / else, например, тип опции следующим образом:

let internal (=%=) (W : int, thriller : Dev -> unit -> bool) =
    let id = get W
    if id <> -1 then
        Some (workbase.[id] |> thriller)
    else None
2 голосов
/ 08 декабря 2011

У вас должна быть часть else в конструкции if-then. Он должен вернуть результат в любом случае.

...