2011-02-14 2 views
0

Как вы можете видеть на массу вопросов, которые я задаю, я действительно все глубже и глубже в F # :)Работа с нулевыми значениями в F #

Другое сомнение подходы мой путь обучения: нулевые значения. Как обращаться с ними, учитывая, что это необходимо из-за тесной интеграции между .NET framework и F # (или любым другим языком в рамках)?

Для простоты, вот кусочек кода:

let myfunc alist = 
    try 
     List.find (fun x -> true) alist 
    with 
     | :? KeyNotFoundException as ex -> (* should return null *) 

Как я могу вернуть нуль в функции?
Ключевое слово null бесполезно, если не распознано (не то же самое для nil).
И, вообще говоря, какова наилучшая практика при обработке возвращаемых значений null?

ответ

6

Я не совсем уверен, в чем вопрос. Если вы закончите ваш пример:

open System.Collections.Generic 

let myfunc alist = 
    try 
     List.find (fun x -> true) alist 
    with 
     | :? KeyNotFoundException as ex -> null 

вы обнаружите, что он компилируется нормально, и выведенный тип myfunc : 'a list -> 'a when 'a : null указывает, что тип находится в списке, который вы передаете должны null как собственное значение. F # отлично справляется с нулевыми значениями при использовании типов, определенных в C#, VB.NET и т. Д.

Однако, если вы не взаимодействуете с кодом, написанным на другом языке .NET, типичным подходом было бы возвращение a 'a option, чтобы указать, что значение может быть или не быть. Затем, ваш пример станет:

let myfunc alist = 
    try 
     List.find (fun x -> true) alist 
     |> Some 
    with 
     | :? KeyNotFoundException as ex -> None 

, который будет работать в списках, содержащих любой тип (даже те, которые не имеют нуль в качестве собственного значения). Конечно, в этом случае вы могли бы просто использовать List.tryFind (fun _ -> true).

+2

Согласен, но я думаю, что 'List.tryFind' заслуживает более заметного упоминания. Требование создания платформы .NET для создания стека вызовов и исключения исключений каждый раз, когда он не находит то, что вы ищете, - это не способ хорошей производительности. 'let myfunc = List.tryFind (fun _ -> true)' это путь. –

Смежные вопросы