F # Объявление типа возможно аля Haskell? - PullRequest
25 голосов
/ 15 сентября 2010

Я посмотрел несколько источников: кажется, невозможно объявить определение типа в F # ala Haskell:

' haskell type def:
myFunc :: int -> int

Я бы хотел использовать этот стиль определения типа в F # - FSI с радостью ответит мне:

fsi> let myType x = x +1;;

val myType : int -> int

Я бы хотел прямо указать сигнатуру определения типа в F #, как в Haskell. Есть ли способ сделать это? Я хотел бы написать на F #:

//invalid F#
myFunc : int -> int
myFunc x = x*2

Ответы [ 6 ]

23 голосов
/ 15 сентября 2010

Обычный способ - сделать let myFunc (x:int):int = x+1.

Если вы хотите быть ближе к стилю haskell, вы также можете сделать let myFunc : int -> int = fun x -> x+1.

20 голосов
/ 15 сентября 2010

Если вы хотите хранить читаемые объявления типов отдельно от реализации, вы можете использовать файлы 'fsi' (файл подписи F #). 'Fsi' содержит только типы и обычно также комментарии - вы можете увидеть несколько хороших примеров в источнике библиотек F #. Вы бы создали два файла, как это:

// Test.fsi
val myFunc : int -> int

// Test.fs
let myFunx x = x + 1

Это работает для скомпилированных проектов, но вы не можете легко использовать этот подход с F # Interactive.

1 голос
/ 26 июня 2014

Другой вариант - использовать «сокращения типа» (http://msdn.microsoft.com/en-us/library/dd233246.aspx)

type myType = int -> int
let (myFunc : myType) = (fun x -> x*2)
1 голос
/ 15 сентября 2010

См. Также Базовый синтаксис F # - Типы (который обсуждает этот аспект немного под «аннотациями типов»).

1 голос
/ 15 сентября 2010

Вы можете сделать это в F #, чтобы указать возвращаемое значение myType.

let myType x : int = x + 1

Вы также можете указать тип параметра.

let myType (x : int) : int = x + 1

Надеюсь, это поможет!

0 голосов
/ 19 октября 2015

да, вы можете, используя лямбда-функции

myFunc : int -> int =
  fun x -> x*2

, это также устраняет проблему в haskell при записи имени функции дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...