BG Development


  Reply to this topicStart new topicStart Poll

> Haskell: Ден от седмицата за определена дата
FidelDahan
Публикувано на: 23-01-2016, 00:20
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2429
Регистриран на: 12.06.08



Дадоха ни домашно да решим тази задача на Haskell.

Примерен Вход: 2016, 1, 22
Примерен Изход: Петък

Опитвам се да я реша без да използвам готова формула за изчисление на деня и също без твърде много от вградените функции в Хаскел.

Вместо това искам да направя така, че ако имам една известна дата от миналото и знам ден от седмицата съответства точно на тази дата, да направя брояч, който да брои нагоре дните докато стигне до търсената дата.

Обаче нещо при работата със собствени типове данни се оплетох.


CODE
isFactor :: Int -> Int -> Bool
isFactor factor number = number `rem` factor == 0

isLeapYear :: Int -> Bool
isLeapYear year
 | isDivisibleBy400 year = True
 | isDivisibleBy100 year = False
 | isDivisibleBy4 year = True
 | otherwise = False
 where
   isDivisibleBy4 = isFactor 4
   isDivisibleBy100 = isFactor 100
   isDivisibleBy400 = isFactor 400

type Year = Int

data Month =
 Jan |
 Feb |
 Mrz |
 Apr |
 Mai |
 Jun |
 Jul |
 Aug |
 Sep |
 Oct |
 Nov |
 Dez
 deriving (Show, Eq, Ord)

type Day = Int

data Date =
 Date Year Month Day
 deriving (Show, Eq, Ord)

data Weekday =
 Mo | Di | Mi | Do | Fr | Sa | So
 deriving (Show, Eq, Ord)


daysInMonth :: Year -> Month -> Int
daysInMonth _ Jan = 31
daysInMonth year Feb = if isLeapYear year then 29 else 28
daysInMonth _ Mrz = 31
daysInMonth _ Apr = 30
daysInMonth _ Mai = 31
daysInMonth _ Jun = 30
daysInMonth _ Jul = 31
daysInMonth _ Aug = 31
daysInMonth _ Sep = 30
daysInMonth _ Oct = 31
daysInMonth _ Nov = 30
daysInMonth _ Dez = 31


refDate :: Date
refDate = Date 1989 Mrz 17

refWeekday :: Weekday
refWeekday = Fr

--nextDate :: Date -> Date
--nextDate date = Date (Year date) (Month date) (Day date)



Някаква идея как може да се програмира броячната функция nextDate?
PMEmail Poster
Top
felore
Публикувано на: 23-01-2016, 03:40
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3870
Регистриран на: 22.10.09



Готина задача. Особено за Хаскел. Защо обаче държиш да използваш собствени типове? Или е изискване по задачата? Склонен съм да мисля, че не е изискване по задачата, а просто те омайва ООП-то отново. icon_smile.gif

Прощавай, че не отговарям конкретно по темата, но мисля, че подходът ти е грешен. Едно, че не е разумно да използваш собствени типове в конкретния случай, и две, че не е нужно да броиш ден по ден.

https://gist.github.com/ydm/390fde64b3ef9e0eb787


--------------------
PMEmail Poster
Top
FidelDahan
Публикувано на: 24-01-2016, 15:27
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2429
Регистриран на: 12.06.08



Както винаги минималистично icon_cool.gif Опитах със собствени типове за да разбера как се използват. Защото когато една програма стане малко по-голяма собствените типове дават многобройни предимства, даже и нещото да може да се отрази чрез някой от вградените типове. Това въжи без значение дали сме в ОО или ФП, обратното се казва "Primitive Obsession" (анти-патърн). Благодаря за примера, ще го разучавам тия дни.
PMEmail Poster
Top
felore
Публикувано на: 24-01-2016, 17:01
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3870
Регистриран на: 22.10.09



Хаха, за миг се изплаших, че страдам от тоя анти патърн, ама после прочетох и разбрах, че е само частично. icon_lol.gif


--------------------
PMEmail Poster
Top
AK-85
Публикувано на: 24-01-2016, 18:57
Quote Post



Име:
Група: Потребител
Ранг: Старо куче

Мнения: 815
Регистриран на: 06.07.06



Какъв е проблемът със собствените типове? В език с изразителна система на типовете идеята е точно да се дефинират собствени типове, които да отразяват прецизно семантиката на променливите, които се използват, така че колкото се може повече грешки да се свеждат до разминаване на типовете и да се хващат статично.
PM
Top
felore
Публикувано на: 24-01-2016, 19:33
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3870
Регистриран на: 22.10.09



Мен ме кефят безтиповите езици. icon_smile.gif


--------------------
PMEmail Poster
Top
FidelDahan
Публикувано на: 28-01-2016, 09:10
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2429
Регистриран на: 12.06.08



И аз успях най после icon_cool.gif https://gist.github.com/rusio/898f3d90aab3b0169b2d

Голям кеф! Първата ми програма на Хаскел icon_cool.gif
Чувството е се все едно първи семестър icon_biggrin.gif

ай ай ай icon_smile.gif
PMEmail Poster
Top
Fly
Публикувано на: 28-01-2016, 09:18
Quote Post



Име: Димитър Костов
Група: Потребител
Ранг: Почетен член

Мнения: 4047
Регистриран на: 02.02.07



Евалата и да почерпиш, ти си 3-тия човек който е написал програма на Haskell
PMEmail Poster
Top
felore
Публикувано на: 28-01-2016, 10:22
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3870
Регистриран на: 22.10.09



Евалата! icon_smile.gif Що не пишеш на английски?


--------------------
PMEmail Poster
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0