Поиск:

Ответ в темуСоздание новой темы Создание опроса
> F#, Помогите начинающему 
:(
    Опции темы
Garcian
  Дата 9.4.2012, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Здравствуйте, лишь недавно начал изучать 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. Буду рад любой помощи

Это сообщение отредактировал(а) Garcian - 9.4.2012, 14:26
--------------------
Неродивый студент
PM MAIL   Вверх
Kakadu
Дата 23.4.2012, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 19.3.2008

Репутация: нет
Всего: 7



Вроде должна вызываться. Но я в голове компилровал.


А если по делу, то посмотри как задают деревья через алгебраические типа. Потом попробуй сделать так же для своих а-ля В-деревьев.


--------------------
Добрые мариносы долго кормили украдкой маленьких зерлингов. От этой украдки зерлинги пухли и дохли
PM MAIL   Вверх
dlebedev
Дата 24.4.2012, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 24.4.2012

Репутация: нет
Всего: нет



Не уверен, что все правильно понимаю... Вроде F# не ленивый язык, но, чем черт не шутит? Попробуйте добавить после вызова IO |> Tree еще и вывод результата на экран.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума «Функциональные языки: общие вопросы»
Void
  • Пожалуйста, создавайте темы с содержательными названиями. Если у Вас вопрос по конкретному языку, укажите его в заголовке, например: «[Haskell] Как использовать монаду State».
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0977 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.