& Ldquo; Подъем & Rdquo; исключения из типов Option

Format-* командлеты были сделаны для отображения данных пользователю. Не используйте их, когда требуется / предназначена дальнейшая обработка данных.

Измените

... | select samaccountname | Format-Table -HideTableHeaders | Out-String

на

... | select -Expand samaccountname -First 1

, и ваша проблема исчезнет.

1
задан Flimzy 15 January 2019 в 10:02
поделиться

1 ответ

Прежде всего, я думаю, что это неправда, что «концепция, которая больше относится к объектно-ориентированному миру, является исключением» . Исключения существуют во многих функциональных языках семейства ML, и, например, OCaml довольно сильно полагается на них и использует их даже для определенных структур потоков управления. В F # это не так, потому что .NET-исключения несколько медленнее, но я вижу исключения, очень ортогональные к объектно-ориентированной / функциональной проблеме.

По этой причине я нахожу исключения, часто более предпочтительными, чем типы опций в F #. Недостатком является то, что меньше проверок типов (вы не знаете, что может генерировать), но есть и то, что язык обеспечивает хорошую встроенную поддержку языков для исключений. Если вам нужно обработать исключительные ситуации, то исключения - хороший способ сделать это!

Чтобы ответить на ваш первоначальный вопрос о синтаксических уловках, которые вы можете сделать - я, вероятно, просто использовал бы функцию в качестве вашей существующий код делает это, потому что он явный и простой для понимания (и, вероятно, вам понадобится только перенос исключений в некоторых реализуемых вами основных функциях).

Тем не менее, вы можете определить построитель выражений вычислений, который оборачивает код в тело и служит в качестве вашей функции catchAll с несколько более точным синтаксисом:

type CatchAllBuilder() = 
  member x.Delay(f) = try Some(f()) with _ -> None
  member x.Return(v) = v

let catchAll = CatchAllBuilder()

Это позволяет вам писать что-то вроде:

catchAll { return Array.empty.[0] }

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

[РЕДАКТИРОВАТЬ: Теперь рабочая версия с return - это несколько менее красиво, но, возможно, все еще полезно!]

0
ответ дан Tomas Petricek 15 January 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: