Вот код, который отлично работает:
let f x y z = x + y + z
let g x y = f x y
let h x z = z |> f x
Так что я могу написать выражение «h 1», и FSI отобразит:
val it : (int -> int -> int) = <fun:it@110-3>
Если я назову «h 1 2 3», аргументы применяются в правильном порядке.
Но если последний аргумент имеет другой тип, все становится иначе:
let ff x y (z : string) = x + y
let gg x y = ff x y
let hh x (z : string) = z |> ff x
Теперь последняя функция hh вызывает сообщение об ошибке:
Script.fsx (119,10): ошибка FS0001: несоответствие типов.Ожидая string -> 'a
, но учитывая int -> string -> int
.Тип string
не совпадает с типом int
Я понимаю, почему это происходит - "z" добавляется к "ff x", делая его вторым аргументом.Но тогда я ожидал бы, что в первом примере выражение «h 1 2 3» не будет работать должным образом (выполняется как «f 1 3 2»).Но это работает просто отлично.