Если это не головоломка или вызов, вы можете предположить, что 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