F#: Span, Raise и нижний тип (или их отсутствие)

После того, как я разместил этот комментарий https://github.com/fsharp/fslang-suggestions/issues/349#issuecomment-1124206512 Я все еще чувствую, что упускаю...

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

let spanOfOptString(os: Option<string>) =
  match os with Some(s) -> s.AsSpan()
                | None -> raise(Exception())

error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL.

Итак, F# вводит невозвратную функцию raise как Exception -> 'a со свободным 'a («способ OCaml»), а переменная типа оказалась привязанной к типу по ссылке ReadOnlySpan, что было недопустимо. Мне казалось, что меня наказали за преступление, которого я не совершал...

Я мог найти обходной путь, который был чем-то вроде

let checkedSpanOfString(os: Option<string>) =
  match os with Some(s) -> s.AsSpan()
                | None -> raise(Exception())  // 'a = unit
                          ReadOnlySpan.Empty  // both arms: ReadOnlySpan<char>

https://sharplab.io/#gist:32b520574fde97de8d7389ab04f64bc4

но ИМХО это несколько некрасиво. И я не думаю, что мы должны ожидать, что что-то эквивалентное .Empty будет доступно для типов byref все? (Я не думаю, что когда-либо использовал какие-либо другие типы byref, кроме (ReadOnly)Span/Memory, но это уже другая история)

Хотя основная команда F#, похоже, не движется к внедрению нижнего типа в язык (что, возможно, является разумным инженерным решением),
есть ли у кого-нибудь лучшая альтернатива, чтобы сделать эту работу?

Обновлять

Ответ @chadnt может быть встроен, чтобы получить

let checkedSpanOfString(os: Option<string>) =
  let s = match os with Some(s) -> s
                        | None -> raise(Exception())
  s.AsSpan()

https://sharplab.io/#gist:a5eab805c539c45048b4072fa7b096c5

Его ИЖ выглядит намного проще, чем мой оригинальный вариант

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, сначала кажется, что присвоение строкового значения решает эту проблему.

open System

let valueOrRaise = function
    | Some v -> v
    | None -> raise(Exception())

let checkedSpanOfString (os: string option) =
    let s = valueOrRaise os
    s.AsSpan()

https://sharplab.io/#gist:2ca959f498be87f1b52212182af237b4

В ФСИ:

> (checkedSpanOfString (Some "foo")).ToString();;
val it: string = "foo"

господи, это было мое слепое пятно...

nodakai 17.05.2022 21:09

О, я вижу, что inref не имеет к этому никакого отношения. Я отредактирую свой ответ.

chadnt 17.05.2022 21:22

Другие вопросы по теме