Для ответа на вторую половину вашего вопроса, родовые типы в F # можно задать с помощью либо синтаксиса O'Caml-стиле, где общий параметр предшествует тип (например, 'a list
, int array
и т.д. .) или .NET-стиль с угловыми скобками (например, list<'a>
, array<int>
и т. д.), поэтому два определения действительно в основном эквивалентны (за исключением того, что ваша версия в письменном виде синтаксически недействительна, так как lazy
- это ключевое слово). Для многопараметрических типичных типов стиль O'Caml устарел и будет генерировать предупреждение (например, let (m:(int,string) Map) = Map.empty
следует переписать как let (m:Map<int,string>) = Map.empty
).
На самом деле это позволяет использовать любую строку в качестве идентификатора, так что вы любите идентификаторы с вопросительными знаками (аля Ruby) вы можете сказать: \t пусть '' хорошо '' = ложь Хотя Я не уверен, что это действительно хороший способ написать код. – Robert