как получить эту подпись в f #: val sigF: int -> bool -> float -> string - PullRequest
1 голос
/ 13 марта 2019

Я использую FSI, как перейти от bool к float?

  • есть: let sigF 1 = 1 = 1 получает: val sigF: int -> bool
  • нужна функция, которая имеет подпись: val sigF: int -> bool -> float -> string

вы не можете конвертировать bool в float?Есть ли какие-либо ресурсы по пониманию сигнатур? Я не могу найти примеров, когда bool обращается к чему-то еще, мне нужно лучше понимать "curry"?(Я совершенно новичок в функциональном программировании)

Ответы [ 3 ]

3 голосов
/ 14 марта 2019

Если это не головоломка или вызов, вы можете предположить, что i:int -> b:bool -> f:float -> string совпадает с int -> bool -> float -> string.Единственное отличие состоит в том, что первый также включает имена параметров функции - это просто дополнительная информация, которую вы можете игнорировать и которая не сильно меняет смысл.

Вы получаете имена параметров, если вы что-то делаетекак это:

> let sigF (i:int) (b:bool) (f:float) = "";;
val sigF : i:int -> b:bool -> f:float -> string

Инжиниринговое решение от Майкла позволяет избежать именования параметров, вместо этого используя шаблоны (сопоставление с конкретными значениями), что дает вам правильную сигнатуру, но также и большое количество предупреждений, потому что функция потерпит неудачуесли вызывается с любым другим значением в качестве аргумента:

> let sigF 7 true 0.3 = "done";;

warning FS0025: Incomplete pattern matches on this expression. 
  For example, the value '0.0' may indicate a case not covered by the pattern(s).
warning FS0025: Incomplete pattern matches on this expression. 
  For example, the value 'false' may indicate a case not covered by the pattern(s).
warning FS0025: Incomplete pattern matches on this expression. 
  For example, the value '0' may indicate a case not covered by the pattern(s).

val sigF : int -> bool -> float -> string

Другое решение, которое дает правильную подпись, но без предупреждений, - это использование шаблона _ с аннотацией типа - это говорит о том, что вы игнорируетеargumnet, но он дает ему явный тип:

> let sigF (_:int) (_:bool) (_:float) = "";;
val sigF : int -> bool -> float -> string
2 голосов
/ 14 марта 2019

let f 7 true 0.3 = "done" ;;

  • 7 true и .03 (все подразумевают функциональные входы), в то время как после = есть выход

val f: int -> bool -> float -> string

0 голосов
/ 13 марта 2019

Функция, имеющая подпись val sigF : int -> bool -> float -> string, может быть, например, let sigF (i:int) (b:bool) (f:float) = "".Последний в ряду символов -> является выходным сигналом, все остальные являются входными данными.

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