Здравствуйте, _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>>
Здравствуйте, Кодт, Вы писали:
К>Не так. Это особенности синтаксиса языков с каррингом, в частности, Хаскелла и ML.
Да,
разобралсяАвтор: _FRED_
Дата: 14.01.08
(там же следующий вопрос
)
К>P.S.
К>Пожалуй, зря тут стали на Хаскелле прототипировать. Только запутали.
Да не, нормально
По крайней мере наконец-то руки дошли до "Мягкого введения"
Здравствуйте, _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>>