f # многострочные троичные выражения - PullRequest
4 голосов
/ 14 ноября 2011
let a = [
    1;
    2;
    3;
    if 3 > 2 then
        4;
    else
        5;
    6
]

Что не так: «эта конструкция недопустима ... ... Паразитировать это выражение, чтобы указать, что это отдельный элемент списка ...», что я и делаю,

let a = [
    1;
    2;
    3;
    (if 3 > 2 then
        4
    else
        5);
    6
]

заставляет компилятор сказать мне "непревзойденный" ('". Очевидно, что компилятору не нравятся условные выражения с несколькими строками. Почему это так? И есть ли способ обойти это?

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

РЕДАКТИРОВАТЬ: это работает:

let a = [
    1;
    2;
    3;
    if 3 > 2 then yield(
        4
    )else yield(
        5);
    6
]

, но несколько более многословно, чем я бы предпочел (5 ключевых слов и 4 скобки для простой троичной операции!). Поиск чего-то более чистого продолжается

Ответы [ 2 ]

7 голосов
/ 14 ноября 2011

Вам просто нужно сделать отступ в else слева от if после добавления (

let a = [
    1;
    2;
    3;
    (if 3 > 2 then
        4
     else //same column as matching if
        5);
6
]
2 голосов
/ 14 ноября 2011

Многострочный, когда точка с запятой не требуется.

let a = [
    1
    2
    3
    (if 3 > 2 then 4 else 5)
    6
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...