Я новичок в ML, но на других языках, которые используют вывод типов, я научился опускать тип вещи всякий раз, когда вывод с правой стороны очевиден для читателя, и явно объявлятьтип вещи всякий раз, когда вывод не очевиден для человека.Мне нравится это соглашение, и я хотел бы продолжить его в своем коде ML.
У меня есть следующие примеры объявлений функций, которые эквивалентны:
fun hasFour [] = false
| hasFour (x::xs) = (x = 4) orelse hasFour xs
эквивалентно
val rec hasFour: int list -> bool =
fn [] => false
| (x::xs) => (x = 4) orelse hasFour xs
Мне нравится последняя форма не только потому, что мне легче выяснить, какого типа функция, когда я ее читаю, но и потому, что она явно объявляет тип функции и, следовательно, если я что-то прикручиваюв моей реализации, нет никакого шанса случайно объявить что-то, что синтаксически допустимо, но неправильный тип, который труднее отладить позже.
Мой вопрос: я хочу использовать fun
вместо val rec
потому что анонимные fn
могут принимать только один параметр.Таким образом, последний метод синтаксически недопустим для такой функции, как int -> int -> bool
.Есть ли способ явно объявить тип в fun
?Или я назвал все предпочтительные альтернативы в этом посте, и должен просто следовать одному из этих шаблонов?Единственный способ найти fun
с явным объявлением типа - добавить объявление типа к каждому параметру в шаблоне, что выглядит ужасно и ужасно, например:
fun hasFour ([]:int list):bool = false
| hasFour (x::xs) = (x = 4) orelse hasFour xs
Один из коллег показалВот некоторый код, следующий за шаблоном, подобным этому:
fun hasFour [] = false
| hasFour (x::xs) = (x = 4) orelse hasFour xs
val _ = op hasFour: int list -> bool
Объявляя неназванную переменную и присваивая ей экземпляр функции с принудительным типом, мы эффективно достигаем желаемого результата, но val _
долженпоявится ниже полностью определенной функции, где она менее очевидна для читателя, если вы просто не привыкнете к этому шаблону и не научитесь ожидать его.