LINUX.ORG.RU

История изменений

Исправление yoghurt, (текущая версия) :

data Jacks = J {
  jIntro      :: String
, jReferenced :: String
, jAction     :: Action
} deriving (Eq, Show)


data Action = A String Jacks | E String
              deriving (Eq, Show)

house    = J "Вот дом"                         "\nВ доме"           (E "Который построил Джэк.")
wheat    = J "А это пшеница"                   "пшеницу"            (A "Которая в темном чулане хранится" house)
bird     = J "А это веселая птица-синица"      "синицу"             (A "Которая часто ворует" wheat)
cat      = J "Вот кот"                         "кота"               (A "Который пугает и ловит" bird)
dog      = J "Вот пес без хвоста"              "пса без хвоста"     (A "Который за шиворот треплет" cat)
cow      = J "А это корова безрогая"           "корову безрогую"    (A "Лягнувшая старого" dog)
granny   = J "А это старушка, седая и строгая" "коровницей строгою" (A "Которая доит" cow)
cowboy   = J "А это ленивый и толстый пастух"  "того пастуха"       (A "Который бранится с" granny)
roosters = J "Вот два петуха"                  ""                   (A "Которые будят" cowboy)

expand :: Jacks -> [String]
expand j = (jIntro j ++ ",\n" ++ expandAction (jAction j) ++ "\n") : expandNext
  where
    expandAction a = case a of
        E s    -> s
        A s j' -> s ++ " " ++ jReferenced j' ++ ",\n" ++ expandAction (jAction j')
    expandNext = case (jAction j) of
        E _    -> []
        A _ j' -> expand j'

houseJackBuilt = unlines $ reverse (expand roosters)

Выхлоп

Вот дом,
Который построил Джэк.

А это пшеница,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это веселая птица-синица,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Вот кот,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Вот пес без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это корова безрогая,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это старушка, седая и строгая,
Которая доит корову безрогую,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это ленивый и толстый пастух,
Который бранится с коровницей строгою,
Которая доит корову безрогую,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Вот два петуха,
Которые будят того пастуха,
Который бранится с коровницей строгою,
Которая доит корову безрогую,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Лень фиксить склонение действий коровы.

Исправление yoghurt, :

data Jacks = J {
  jIntro      :: String
, jReferenced :: String
, jAction     :: Action
} deriving (Eq, Show)


data Action = A String Jacks | E String
              deriving (Eq, Show)

house    = J "Вот дом"                         "\nВ доме"           (E "Который построил Джэк.")
wheat    = J "А это пшеница"                   "пшеницу"            (A "Которая в темном чулане хранится" house)
bird     = J "А это веселая птица-синица"      "синицу"             (A "Которая часто ворует" wheat)
cat      = J "Вот кот"                         "кота"               (A "Который пугает и ловит" bird)
dog      = J "Вот пес без хвоста"              "пса без хвоста"     (A "Который за шиворот треплет" cat)
cow      = J "А это корова безрогая"           "корову безрогую"    (A "Лягнувшая старого" dog)
granny   = J "А это старушка, седая и строгая" "коровницей строгою" (A "Которая доит" cow)
cowboy   = J "А это ленивый и толстый пастух"  "того пастуха"       (A "Который бранится с" granny)
roosters = J "Вот два петуха"                  ""                   (A "Которые будят" cowboy)

expand :: Jacks -> [String]
expand j = (jIntro j ++ ",\n" ++ expandAction (jAction j) ++ "\n") : expandNext
  where
    expandAction a = case a of
        E s    -> s
        A s j' -> s ++ " " ++ jReferenced j' ++ ",\n" ++ expandAction (jAction j')
    expandNext = case (jAction j) of
        E _     -> []
        A _ j' -> expand j'

houseJackBuilt = unlines $ reverse (expand roosters)

Выхлоп

Вот дом,
Который построил Джэк.

А это пшеница,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это веселая птица-синица,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Вот кот,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Вот пес без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это корова безрогая,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это старушка, седая и строгая,
Которая доит корову безрогую,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это ленивый и толстый пастух,
Который бранится с коровницей строгою,
Которая доит корову безрогую,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Вот два петуха,
Которые будят того пастуха,
Который бранится с коровницей строгою,
Которая доит корову безрогую,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Лень фиксить склонение действий коровы.

Исходная версия yoghurt, :

Haskell sila lisp mogila

data Jacks = J {
  jIntro      :: String
, jReferenced :: String
, jAction     :: Action
} deriving (Eq, Show)


data Action = A String Jacks | E String
              deriving (Eq, Show)

house    = J "Вот дом"                         "\nВ доме"          (E "Который построил Джэк.")
wheat    = J "А это пшеница"                   "пшеницу"            (A "Которая в темном чулане хранится" house)
bird     = J "А это веселая птица-синица"      "синицу"             (A "Которая часто ворует" wheat)
cat      = J "Вот кот"                         "кота"               (A "Который пугает и ловит" bird)
dog      = J "Вот пес без хвоста"              "пса без хвоста"     (A "Который за шиворот треплет" cat)
cow      = J "А это корова безрогая"           "корову безрогую"    (A "Лягнувшая старого" dog)
granny   = J "А это старушка, седая и строгая" "коровницей строгою" (A "Которая доит" cow)
cowboy   = J "А это ленивый и толстый пастух"  "того пастуха"       (A "Который бранится с" granny)
roosters = J "Вот два петуха"                  ""                   (A "Которые будят" cowboy)

expand :: Jacks -> [String]
expand j = (jIntro j ++ ",\n" ++ expandAction (jAction j) ++ "\n") : expandNext
  where
    expandAction a = case a of
        E s    -> s
        A s j' -> s ++ " " ++ jReferenced j' ++ ",\n" ++ expandAction (jAction j')
    expandNext = case (jAction j) of
        E _     -> []
        A _ j' -> expand j'

houseJackBuilt = unlines $ reverse (expand roosters)

Выхлоп

Вот дом,
Который построил Джэк.

А это пшеница,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это веселая птица-синица,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Вот кот,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Вот пес без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это корова безрогая,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это старушка, седая и строгая,
Которая доит корову безрогую,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

А это ленивый и толстый пастух,
Который бранится с коровницей строгою,
Которая доит корову безрогую,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Вот два петуха,
Которые будят того пастуха,
Который бранится с коровницей строгою,
Которая доит корову безрогую,
Лягнувшая старого пса без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в темном чулане хранится 
В доме,
Который построил Джэк.

Лень фиксить склонение действий коровы.