Работа с нулевыми значениями в F # - PullRequest
0 голосов
/ 14 февраля 2011

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

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

Для простоты, вот фрагмент кода:

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

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

1 Ответ

6 голосов
/ 14 февраля 2011

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

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 option, чтобы указать, что значение может присутствовать или не присутствовать.Тогда вашим примером станет:

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

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

...