Mike Potanin (potan) wrote in ru_lambda,
Mike Potanin
potan
ru_lambda

Ленивость: приемы использования.

Есть простенькая задачка, предложенная gaperton - простая электронная таблица.
В исходном варианте надо было распарсить текст таблицы с формулами, посчитать их и вывести таблицу с результатами.
Наиболее интересный момент задачи - функция из мапа имени ячейки в формулу в мап имени ячейки в значения. Важно так же отслеживать зацикленность в зависимостях ячеек.
Предлогаю вариант решения, который, IMHO, хорошо иллюстрирует ленивость языка. На удачность решения в других контекстах я не притендую :-).
type Mp a = [(String,a)]

data AST = Var String | Const Int | Plus AST AST

mpmap f = map (\(x,y) -> (x,(f y)))

mplookup ((s,v):t) r | r == s = v
                     | True = mplookup t r

lmax [] t = t
lmax t [] = t
lmax (a:b) (_:c) = a:(lmax b c)

le [] _ = True
le _ [] = False
le (_:a) (_:b) = le a b

eval l (Var s) = ((():d),v) where (d,v) = l s
eval _ (Const n) = ([],n)
eval l (Plus a b) = ((():(lmax ad bd)), va+vb)
                       where
                             (ad,va) = eval l a
                             (bd,vb) = eval l b

check m (d,v) =
          if le m d
          then "loop"
          else show v

proc m = let
            r = mpmap (eval (mplookup r)) m
         in mpmap (check (undefined:m)) r


testloop :: Mp AST
testloop = [("A", (Var "B")), ("B", (Var "A")), ("C", (Const 13)), ("D",(Plus (Var "C") (Var "E"))), ("E", (Plus (Var "C") (Const 1)))]

main = print (proc testloop)Syhi-подсветка кода
Subscribe

  • nixos + stack

    Хочу собирать и деплоить небольшое хаскельное приложение на NixOS, как сейчас принято это делать? Я попробовал сделать default.nix с with (import…

  • Современные кондуиты.

    Какие кондуиты нынче в моде? Помню, что несколько лет назад, когда я писал на хаскеле, их было штуки три. Сценарий такой: надо читать текстовый файл…

  • Учебник теории категорий, версия 9

    Видимо, на этом закончу, 400 страниц достаточно. Сделал гиперссылки и закладки https://github.com/George66/Textbook

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 8 comments