F#

 
0
 
Functional languages
ava
Garcian | 09.04.2012, 15:22
Здравствуйте, лишь недавно начал изучать F# (заодно пришлось и подтягивать знания на английском). Но у меня уже появилась задача, переделать программу написанную в C# на F#. Вот собственно часть кода, которую я собираюсь отлаживать

open System

// Структура узла
type Node = struct
    val Level : int
    val Number : int
    val IsLeaf : bool
    val Parent: int
    val Children : int array
    val LeftKey : int
    val RightKey : int
    new(Level, Number, IsLeaf, Parent, Children, LeftKey, RightKey) =  // пока не очень разобрался в конструкторах здесь, не очень удобно определять все поля
        { Level = Level;          
          Number = Number;        
          IsLeaf = IsLeaf;        
          Parent = Parent;
          Children = Children;
          LeftKey = LeftKey;
          RightKey = RightKey }
end

// построение случайного дерева
let Tree elemCount =
    let rand = new Random()
    let levelsCount = rand.Next(2, elemCount) // количество уровней
    let nodes = Array.create levelsCount 0 // каждый эл-т массива показывает число узлов на уровне
    let tree = new Node(1, 1, false, 0, null, 0, 0) :: [] // таким образом сформировали корень
    elemCount - 1 // кол-во оставшийся элементов уменьшили на 1
    nodes.[0] <- 1 // корень - он и есть единственный узел

    for i in 1 .. levelsCount - 1 do
        if i = levelsCount - 1 then
             nodes.[i] <- elemCount // если это последний уровень, то все оставшиеся элементы списка заносим в уровень
        else nodes.[i] <- rand.Next(1, elemCount - levelsCount + i) // иначе кол-во узлов случайное
        elemCount - nodes.[i] // уменьшаем кол-во оставшихся элементов

    let a = 1

    for i in 1 .. levelsCount do // для каждого уровня дерева
        for j in 0 .. nodes.[i] - 1 do // для каждого узла
            let node = new Node() // создаем узел
            node.Level = i + 1 // помечаем его уровень
            node :: tree // добавляем его в список
            node.Number = tree.Length // помечаем его порядковый номер
            if i = 1 then
                node.Parent = a
            else
                node.Parent = rand.Next(a, a + nodes.[i - 1]) // определяем случайным образом его родителей
            a + nodes.[i - 1]
    tree

let main() =
    10 |> Tree

main()


При работе с отладчиком метод (функция?) Tree даже не вызывается. Ну и еще выдает около 15 Warnings. Буду рад любой помощи
Comments (2)
ava
Kakadu | 23.04.2012, 14:15 #
Вроде должна вызываться. Но я в голове компилровал.


А если по делу, то посмотри как задают деревья через алгебраические типа. Потом попробуй сделать так же для своих а-ля В-деревьев.
ava
dlebedev | 24.04.2012, 22:12 #
Не уверен, что все правильно понимаю... Вроде F# не ленивый язык, но, чем черт не шутит? Попробуйте добавить после вызова IO |> Tree еще и вывод результата на экран.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit