Это похоже на ошибку для меня.Компилятор по-разному обрабатывает функции, созданные с использованием let
, и функции, записанные как static member
.
В частности, я думаю, что он не вставляет гибкие типы для аргументов членов, которые явно не объявлены в объявлении члена (то есть аргументов, которые являются либо результатом применения частичной функции, либо создаются с использованием fun
конструкция).
Самый простой пример, демонстрирующий поведение, не использует гибкий тип и выглядит следующим образом:
type A =
static member op = fun (s:obj) -> ()
module B =
let op = fun (s:obj) -> ()
A.op "A" // Error
B.op "A" // Ok
В соответствии со спецификацией (раздел 14.4.2 , опубликованный Брайаном в удаленном (?) Ответе, гибкий тип, который позволяет использовать супертипы, должен быть вставлен независимо от того, является ли вызванная функция членом или значением с привязкой.