Вывод типа F # - PullRequest
       29

Вывод типа F #

2 голосов
/ 24 февраля 2011

Я немного новичок в F #, так что, возможно, мой вопрос тупой.Я написал программу на F #, которая использовала универсальные типы.Компилятор определял типы не так, как я хотел, потому что у меня была ошибка в самом глубоком вызове функции, который я создал для экземпляра неправильного типа.Это, очевидно, привело к несоответствию типов в другом месте, что я использовал тип, как я ожидал.Я должен упомянуть, чтобы найти корень проблемы, которую я пытался явно применить для функций более высокого уровня, чтобы использовать типы, которые я хотел для универсального типа.Однако несоответствие типов было показано в тех высокоуровневых функциях, а не для низкоуровневых функций, в которых был создан экземпляр типа.Я думаю, что это не очень удобный способ определения типов, потому что обычно программистам намного легче определить тип для функций более высокого уровня, и это явное назначение типа должно привести к ошибке типа в функции более низкого уровня, если тип был определен.По моему опыту кажется, что автоматическое определение типа компилятора отменяет явное объявление типа.Я понимаю, что здесь что-то не так?

Что-то вроде приведенного ниже кода:

type test<'a,'b>={Func:'a->'b; Arg:'a}

let C(a)=
  a.Func(2)|>ignore

let B(a)=
  C(a)

let A(a:test<int64,int64>)=
  B(a) //<-----------------------the type mismatch is detected here

Обнаружение ошибки при таком вызове функции высокого уровня затрудняет поиск причины проблемы, потому что теперья должен искать не только ошибки, связанные со значением переменных, но и ошибки определения типа.

1 Ответ

2 голосов
/ 24 февраля 2011

Вывод типа F # является (довольно) строгим сверху вниз, слева направо. Для обсуждения см. Здесь: Почему вывод типа F # настолько изменчив?

Вы можете проверить это, переставив код следующим образом (только для демонстрации):

type test<'a,'b>={Func:'a->'b; Arg:'a}

let rec B(a)=
  C(a)

and A(a:test<int64,int64>)=
  B(a)

and C(a)=
  a.Func(2)|>ignore   // type mismatch now here

Уровень удобства зависит в основном от конкретного кода, по моему опыту. Но я должен признать, что меня тоже иногда удивляли сообщения об ошибках несоответствия типов. Требуется некоторое время, чтобы привыкнуть.

...