June 26, 2020

Merhaba,

Basit bir sorum olacak

import std.stdio : writeln;
import std.algorithm;
import std.range;


void main() {
 // Sıralı bir deste
	double [][] temp2D  = [ [1,2], [3,4], [5,6]];

	writeln( temp2D.fold!( (a,b) => a ~ b ));
}

Bekleneni yapiyor ve [1, 2, 3, 4, 5, 6] yazdiriyor.

Fakat

writeln( temp2D.fold!( (a,b) => a ~ b )([])); Kullanirsam yani bos bir dizi ile baslatirsam

[0, 0, 0, 0, 0, 0, 240, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 8, 64, 0, 0, 0, 0, 0, 0, 16, 64, 0, 0, 0, 0, 0, 0, 20, 64, 0, 0, 0, 0, 0, 0, 24, 64]

Neden boyle oldugunu anlayamadim sormak istedim .

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 26, 2020

Anlaşılan, sonucun türü asıl dizi elemanlarının türü değil, seed'in türü olarak seçiliyor. Bir hata olup olmadığından emin değilim. Bunu anlamak için şu satırı kullandım:

   pragma(msg, typeof([]));    // <-- void[]

Yani, fold son olarak cast(void[]) yapıyor ve double'ların baytlarını veriyor. Kodunda onun yerine '(double[]).init' kullanırsan istediğin sonucu alıyorsun.

Buna rağmen, bu iş için joiner'ı hatırlatırım:

   writeln(temp2D.joiner);

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]