F # Объявление типа возможно ala Haskell?
Я просмотрел несколько источников: в F # ala Haskell, как представляется, невозможно объявить определение типа:
' haskell type def:
myFunc :: int -> int
Я хотел бы использовать этот стиль типа def в F # - FSI с радостью откликнется на меня:
fsi> let myType x = x +1;;
val myType : int -> int
Я хотел бы быть явным о сигнатуре типа def в F #, как в Haskell. Есть ли способ сделать это? Я бы хотел написать в F #:
//invalid F#
myFunc : int -> int
myFunc x = x*2
Ответы
Ответ 1
Если вы хотите сохранить читаемые декларации типов отдельно от реализации, вы можете использовать файлы "fsi" (файл подписи F #). "Fsi" содержит только те типы и обычно также комментарии - вы можете увидеть некоторые хорошие примеры в источнике библиотек F #. Вы бы создали два таких файла:
// Test.fsi
val myFunc : int -> int
// Test.fs
let myFunx x = x + 1
Это работает для скомпилированных проектов, но вы не можете легко использовать этот подход с помощью F # Interactive.
Ответ 2
Обычный способ - сделать let myFunc (x:int):int = x+1
.
Если вы хотите быть ближе к стилю haskell, вы также можете сделать let myFunc : int -> int = fun x -> x+1
.
Ответ 3
Вы можете сделать это в F # так, чтобы указать возвращаемое значение myType.
let myType x : int = x + 1
Вы также можете указать тип параметра.
let myType (x : int) : int = x + 1
Надеюсь, это поможет!
Ответ 4
См. также Основной синтаксис F # - типов (который немного обсуждает этот аспект под аннотациями типа).
Ответ 5
Другой вариант - использовать аббревиатуры типа (http://msdn.microsoft.com/en-us/library/dd233246.aspx)
type myType = int -> int
let (myFunc : myType) = (fun x -> x*2)
Ответ 6
да, вы можете, используя лямбда-функции
myFunc : int -> int =
fun x -> x*2
это также позволяет избежать проблемы в haskell для записи имени функции дважды.