Рассмотрим следующий код:
let f a = if a > 5 then true
Если вы вызываете f 10
, он возвращает true
.
Теперь спросите себя: что должно f 2
вернуться? Я знаю, что вы скажете false
, но как компилятор это знает? Я имею в виду, что это так же вероятно, что вы хотели, чтобы он вернулся true
в обоих случаях, не так ли? Или даже, возможно, сбой в случае a <= 5
, кто знает?
Итак, чтобы программа была «полной» (т.е. содержала инструкции о том, что делать в любой ситуации), вы всегда имеете для указания ветви else
.
unit
, однако, special .
Возврат unit
означает, что нет значащее возвращаемое значение. По существу unit
означает побочный эффект: это означает, что вещь, которая вернула его, должна была произвести некоторый эффект во внешнем мире. Так как F # не является чистым языком, то такие unit
-повторящие вещи довольно повсеместны. Например, ведение журнала отладки:
let f x =
if x < 42 then printfn "Something fishy, x = %d" x
x + 5
С такими утверждениями нет никакой двусмысленности: всегда известно, что ветвь else
предназначена для возврата ()
. В конце концов, нет других значений unit
, есть ли? В то же время, всегда добавляя else ()
в конце, было бы очень утомительно и запутывать. Таким образом, в интересах удобства использования компилятор не нуждается в ветви else
в этом конкретном случае.
Я мог бы также добавить это как ответ:
=IF(ISBLANK(INDIRECT("Cities!A"&ROW(A2))),INDIRECT("Repeat!A"&(ROWS($A$2:A2)-(COUNTA(Cities!A:A)-2))),Cities!A2)
отлично работает в Google Sheets и Excel.
Это также работает и может быть предпочтительным в Excel, чтобы избежать использования Косвенного:
=IF(ISBLANK(INDEX(Cities!A:A,ROW(A2))),INDEX(Repeat!A:A,ROWS($A$2:A2)-(COUNTA(Cities!A:A)-2)),Cities!A2)
это будет работать, только если вы вставите его в A5 того же листа и перетащите его вниз:
=IF(ISBLANK(INDIRECT(ROW(A1))),INDIRECT((ROWS($A$1:A4)-(COUNTA(A:A)-2))),A1)
в противном случае вы можете использовать:
=QUERY({Sheet1!A1:A4;Sheet1!A1:A4;Sheet1!A1:A4},"select *",0)
или:
=TRANSPOSE(SPLIT(REPT(JOIN(",",Sheet1!A1,Sheet1!A2,Sheet1!A3,Sheet1!A4&","),3),",",1))
или:
=TRANSPOSE(SPLIT(REPT(Sheet1!A1&","&Sheet1!A2&","&Sheet1!A3&","&Sheet1!A4&",",3),",",1))
или:
function REPEAT(range,amount,header) {
var output = [];
// check if range is cell
if(typeof range == 'string') {
for(var i=0; i<amount; i++) {
output.push([range]);
}
return output;
} else {
// check if header is wanted
var value;
if(header == 1) {
output.push(range[0]);
value=header;
} else if(header == "") {
value=0;
} else {
value=0;
}
for(var i=0; i<amount; i++) {
for(var j=value, jLen=range.length; j<jLen; j++) {
output.push(range[j]);
}
}
return output;
}
}
<час> =REPEAT(Sheet1!A1:A4,3,0)