2015-11-10 3 views
1

мне нужно помощь, чтобы понять следующее заявление:Что означает использование скобок в F #?

let dictionary = [ for i in 1..4 -> i, true ] |> Map.ofSeq 

В частности, я запутался о правилах, касающихся использования скобок.

  1. Что означает использование скобок в F #?
  2. Какой тип набора/набора прилагаются скобки? (т. е. массив, seq, список и т. д.)
  3. Может ли любое выражение, возвращающее коллекцию, использоваться в скобках?

ПРИМЕЧАНИЕ

Я ничего не знаю о F #. Поэтому, пожалуйста, простите мое невежество.

+3

Кронштейны нотация для инициализации списка. См. Https://msdn.microsoft.com/en-us/library/dd233224.aspx Также для последовательностей вы можете использовать '{}': https://msdn.microsoft.com/en-us/library/dd233209.aspx Хорошее введение в выражения F # находится здесь: http://fsharpforfunandprofit.com/series/expressions-and-syntax.html – Petr

+1

Небольшое предупреждение, однако, не ошибайтесь, используя скобки в коде (обозначая, что вы используете список) и скобку в типе (как показано в интерактивных или парящих вещах в визуальной студии); в этом случае они стоят за массив. Пример: 'let arr = [| 42 |] // val arr: int [] = [| 42 |] ' – Sehnsucht

ответ

2

Просто сломайте его.

let step1 = [ for i in 1..4 -> i, true ] 
let step2 = step1 |> Map.ofSeq 

Тогда вы можете быть в состоянии прочитать «подпись» каждый шаг:

val step1 : (int * bool) list = [(1, true); (2, true); (3, true); (4, true)] 
val step2 : Map<int,bool> = map [(1, true); (2, true); (3, true); (4, true)] 

step1 затем список поэтому скобки для списка (выражение списка). Внутри списка есть кортеж (тип алгебраических данных, тип продукта) int и bool (int * bool) (обратите внимание на * для 'продукта').

Этап 2 представляет собой карту, созданную из последовательности, а список также представляет собой последовательность, поэтому это причина, по которой это работает (или списки поддерживают интерфейс последовательности). ofSeq Должна быть полная распродажа, я бы предположил.

Map.ofList Использования, возможно, сделаю его менее запутанным, но его эквивалент

let step1 = [ for i in 1..4 -> i, true ] 
let step2 = step1 |> Map.ofList 

val step1 : (int * bool) list = [(1, true); (2, true); (3, true); (4, true)] 
val step2 : Map<int,bool> = map [(1, true); (2, true); (3, true); (4, true)] 

Вы можете извлечь пользу из чтения некоторых документов, как: https://msdn.microsoft.com/en-us/library/dd233230.aspx

Теперь пришлите мне мой сертификат от этого курса вашего .. ,;-)

1
[ sequence-expression ] 

Создает список

Другие типы кронштейнов создавать различные типы коллекций например. seq { ... } или \[| sequence-expression |\] для последовательностей (IEnumerable<T>) или массивов соответственно.

Может ли любое выражение, возвращающее коллекцию, использоваться в скобках?

Сорт. Существует целая поддержка для создания различных коллекций (например, yield value), включая также слияние подкатегорий (yield! expression).

Действительно слишком много для быстрого ответа. Ссылки в F # Reference покажут вам эту область.

4

Эти используемые скобки в F #

()

(1, 2)      // Tuple (separator is a comma) 
()       // empty tuple, called unit 

[]

[ 1; 2 ]     // List 
[]       // List.empty 

[| 1; 2 |]     // Array 
[||]      // Array.empty 

{}

seq { yield 1; yield 2 } // Sequence 
Seq.empty     // empty Sequence, not {} 

async { return 1 }   // Computation Expressions, e.g. async 

type record =    // Record type definition 
    { Name : string 
     Age : int 
    } 

<>

type A<'T> = A of 'T    

Типы могут быть легко составлены

let composition = 
    async { return 
       [| 
        [ ("A",1); ("B",2) ] 
        [ ("C",3) ] 
       |] 
    } 
// val composition : Async<(string * int) list []> 
+2

Хотя'() 'кажется пустым кортежем, единица является полностью отдельным типом [' System.Tuple'] (https: // msdn.microsoft.com/en-us/library/system.tuple.aspx) (нет аргументов типа). Это не сразу понятно, учитывая, что синтаксис перекрывается. – Richard

Смежные вопросы