Re[11]: Как обойти дерево от "детей" к "родителям"
От: Кодт Россия  
Дата: 14.01.08 13:25
Оценка:
Здравствуйте, _FRED_, Вы писали:

К>>mapTree node = makeDstNode node (map makeTree (enumChildren node))


_FR>Пытаюсь разобраться, не получается и не вижу, где не прав:


_FR>
  • второй параметр makeDstNode (map makeTree (enumChildren node)) должен иметь тип [DstNode]
    _FR>
  • => map должен получать параметр, имеющий тип [SrcNode]
    _FR>
  • => makeTree получает [SrcNode] (результат enumChildren) и возвращает [SrcNode] — что же эта функция должна делать?

    Не так. Это особенности синтаксиса языков с каррингом, в частности, Хаскелла и ML.
    f g x — каррированная форма функции f(g,x)
    map принимает два параметра: функцию, которую нужно применить ко всем элементам списка, и собственно список.
    То есть, нужно к каждому поддереву из списка (enumChildren node) независимо применить преобразование makeTree.

    P.S.
    Пожалуй, зря тут стали на Хаскелле прототипировать. Только запутали.
    ... << RSDN@Home 1.2.0 alpha rev. 655>>
  • Перекуём баги на фичи!
    Re[12]: Как обойти дерево от "детей" к "родителям"
    От: _FRED_ Черногория
    Дата: 14.01.08 14:24
    Оценка:
    Здравствуйте, Кодт, Вы писали:

    К>Не так. Это особенности синтаксиса языков с каррингом, в частности, Хаскелла и ML.


    Да, разобрался
    Автор: _FRED_
    Дата: 14.01.08
    (там же следующий вопрос )

    К>P.S.

    К>Пожалуй, зря тут стали на Хаскелле прототипировать. Только запутали.

    Да не, нормально По крайней мере наконец-то руки дошли до "Мягкого введения"
    Help will always be given at Hogwarts to those who ask for it.
    Re[12]: Как обойти дерево от "детей" к "родителям"
    От: Кодт Россия  
    Дата: 14.01.08 15:26
    Оценка:
    Здравствуйте, _FRED_, Вы писали:

    К>>>mapTree node = makeDstNode node (map makeTree (enumChildren node))


    _FR>Ага, makeTree — это функция, создавающая экземпляр DstNode по SrcNode? Но как, например, она дожна выглядеть? Ведь создать экземпляр DstNode можно только из дочерних [ DstNode]?


    Ну я не стал разворачивать, какую именно информацию нужно выцарапать из SrcNode, чтобы на её основе сделать DstNode.
    Например,
    data Operation = Plus|Minus|Mult
    
    data SrcNode = Expr Operation [SrcNode] | Const Int
    type DstNode = Int -- результат вычислений
    
    makeDstNode (Const x) _ = x
    makeDstNode (Expr op _) xs = perform op xs
    
    -- + и * ассоциативны, поэтому можно просто суммировать все элементы
    perform Plus xs = foldr (+) 0 xs
    perrofm Mult xs = foldr (*) 1 xs
    -- минус не ассоциативен, поэтому разрешим только одно- и двухместные операции
    perform Minus [x] = -x
    perform Minus [x,y] = x-y
    ... << RSDN@Home 1.2.0 alpha rev. 655>>
    Перекуём баги на фичи!
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.