[Haskell] Самый красивый код
От: nikov США http://www.linkedin.com/in/nikov
Дата: 12.05.09 07:55
Оценка:
Могли бы вы привести самый красивый или элегантный кусок кода на Haskell, который вам приходилось видеть или писать?
Re: [Haskell] Самый красивый код
От: Mr.Cat  
Дата: 12.05.09 08:04
Оценка:
Здравствуйте, nikov, Вы писали:
N>Могли бы вы привести самый красивый или элегантный кусок кода на Haskell, который вам приходилось видеть или писать?
Охх... Самый красивый — не самый красивый — хз, но мне вот этот как-то запомнился больше всего (давно хаскель в руки не брал).
http://rsdn.ru/Forum/message/3272029.1.aspx
Автор: Mr.Cat
Дата: 30.01.09
Re: [Haskell] Самый красивый код
От: Буравчик Россия  
Дата: 12.05.09 10:12
Оценка: 5 (1)
Здравствуйте, nikov, Вы писали:

N>Могли бы вы привести самый красивый или элегантный кусок кода на Haskell, который вам приходилось видеть или писать?

Насчет самого красивого не скажу, но приведу понравившийся код:

-- быстрая сортировка
qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

-- все перестановки элементов списка
permutations [] = [[]]
permutations xs  = [x:ps | x <- xs, ps <- permutations (xs\\[x])]

-- числа Фибоначчи
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

-- "поиск в ширину" в дереве; находит первый элемент, удовлетворяющий предикату testFun
-- дерево задается корнем (root) и функцией генерации дочерних узлов (genChildsFun)
widthSearch :: a -> (a -> [a]) -> (a -> Bool) -> a
widthSearch root genChildsFun testFun = fromJust $ find testFun $ concat $ iterate (concatMap genChildsFun) [root]
Best regards, Буравчик
Re: [Haskell] Самый красивый код
От: thesz Россия http://thesz.livejournal.com
Дата: 12.05.09 11:12
Оценка:
N>Могли бы вы привести самый красивый или элегантный кусок кода на Haskell, который вам приходилось видеть или писать?

data S a = S a (S a)


Бесконечный список.

Срубает неподготовленных напрочь.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[2]: [Haskell] Самый красивый код
От: Mamut Швеция http://dmitriid.com
Дата: 12.05.09 11:32
Оценка:
Б> Насчет самого красивого не скажу, но приведу понравившийся код:

Б>
Б> -- быстрая сортировка
Б> qsort []     = []
Б> qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

Б> -- все перестановки элементов списка
Б> permutations [] = [[]]
Б> permutations xs  = [x:ps | x <- xs, ps <- permutations (xs\\[x])]

Б> -- числа Фибоначчи
Б> fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Б> -- "поиск в ширину" в дереве; находит первый элемент, удовлетворяющий предикату testFun
Б> -- дерево задается корнем (root) и функцией генерации дочерних узлов (genChildsFun)
Б> widthSearch :: a -> (a -> [a]) -> (a -> Bool) -> a
Б> widthSearch root genChildsFun testFun = fromJust $ find testFun $ concat $ iterate (concatMap genChildsFun) [root]
Б>




Что-то подобное, помнится, подтолкнуло меня к функциональшине
avalon 1.0rc1 rev 239, zlib 1.2.3


dmitriid.comGitHubLinkedIn
Re: [Haskell] Самый красивый код
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 13.05.09 03:15
Оценка:
nikov,

N>Могли бы вы привести самый красивый или элегантный кусок кода на Haskell, который вам приходилось видеть или писать?

begin push 5 push 6 add end             --- выдаёт 11
begin push 5 push 6 push 7 add add end  --- выдаёт 18
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[2]: [Haskell] Самый красивый код
От: geniepro http://geniepro.livejournal.com/
Дата: 13.05.09 04:03
Оценка: +1
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>nikov,


N>>Могли бы вы привести самый красивый или элегантный кусок кода на Haskell, который вам приходилось видеть или писать?

LCR>
LCR>begin push 5 push 6 add end             --- выдаёт 11
LCR>begin push 5 push 6 push 7 add add end  --- выдаёт 18
LCR>


Не, ну тогда ещё и:
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
{-# LANGUAGE ExtendedDefaultRules, OverloadedStrings #-}
module Hello where
import Language.BASIC
 
main :: IO ()
main = runBASIC $ do
 
    10 PRINT "Hello BASIC World!"

Re: [Haskell] Самый красивый код
От: pierre  
Дата: 13.05.09 17:03
Оценка:
N>Могли бы вы привести самый красивый или элегантный кусок кода на Haskell, который вам приходилось видеть или писать?

expx = 1 + (integral expx)

sinx = integral cosx
cosx = 1 — (integral sinx)

http://research.swtch.com/2008/02/elegance-and-power.html
Re: [Haskell] Самый красивый код
От: geniepro http://geniepro.livejournal.com/
Дата: 14.05.09 04:21
Оценка: 31 (3)
Здравствуйте, nikov, Вы писали:

N>Могли бы вы привести самый красивый или элегантный кусок кода на Haskell, который вам приходилось видеть или писать?


http://www.reddit.com/info/61rmh/comments/c02kayq

... Here's the Gosper-Salamin algorithm in Haskell:
type GS = (Integer, Integer)
instance Num GS where
    (a,b) * (c,d) = (a*(c+d) + b*c, a*c + b*d)

fib n = fst (x^n)
  where x = (1,0) :: GS
Re[2]: [Haskell] Самый красивый код
От: vdimas Россия  
Дата: 15.05.09 07:39
Оценка:
Здравствуйте, thesz, Вы писали:

T>
T>data S a = S a (S a)
T>


T>Бесконечный список.

T>Срубает неподготовленных напрочь.

Намекаешь на сложность восприятия рекурсивных типов?

А как же не срубает такое?:
struct S { A s; S* next; }

Одна хрень и там и там, рекурсивные типы только через ссылочную семантику и реализуются.
Re[3]: [Haskell] Самый красивый код
От: thesz Россия http://thesz.livejournal.com
Дата: 15.05.09 12:23
Оценка:
T>>
T>>data S a = S a (S a)
T>>

T>>Бесконечный список.
T>>Срубает неподготовленных напрочь.
V>Намекаешь на сложность восприятия рекурсивных типов?

Это не рекурсивный тип в твоём понимании, что ты высказал ниже.

V>А как же не срубает такое?:

V>
V>struct S { A s; S* next; }
V>

V>Одна хрень и там и там, рекурсивные типы только через ссылочную семантику и реализуются.

Это не одна хрень. Даже на глаз видно (параметр у S). Не говоря уж о том, что next должен иметь тип Computation<A> *next.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re: [Haskell] Самый красивый код
От: nikov США http://www.linkedin.com/in/nikov
Дата: 15.05.09 12:35
Оценка:
Из того, что мне самому недавно понравилось:

Функция, применяющая данный набор аргументов к любой функции:

($c).($b).($a)


Частичное применение ко второму аргументу (неявный flip):

(`f` a)
Re: [Haskell] Самый красивый код
От: MigMit Россия http://migmit.vox.com
Дата: 16.05.09 15:13
Оценка:
Здравствуйте, nikov, Вы писали:

N>Могли бы вы привести самый красивый или элегантный кусок кода на Haskell, который вам приходилось видеть или писать?


Я порой публикую свой код, который считаю красивым, у себя на http://migmit.vox.com
Re[4]: [Haskell] Самый красивый код
От: vdimas Россия  
Дата: 17.05.09 21:24
Оценка:
Здравствуйте, thesz, Вы писали:

V>>Намекаешь на сложность восприятия рекурсивных типов?


T>Это не рекурсивный тип в твоём понимании, что ты высказал ниже.


Это рекурсивный тип в понимании рекурсивного типа, а не в том, что ты увидел ниже.

В моем примере был простейший вариант, а если делать "по-модному", то можно и так:
abstract class S<A> { 
  public abstract A Value1 {get; } 
  public abstract S<A> Value2 {get; } }


А на практике так же есть всевозможные градиенты от первого варианта ко второму, и на одной из разновидностей никому не плохеет, однако. Вся твоя наблюдаемая "катастрофичность" восприятия тут может разве что крыться в незнании о ленивости по-умолчанию в Хаскеле, ну дык это лечится одной фразой.

T>Не говоря уж о том, что next должен иметь тип Computation<A> *next.


Как он должен быть в ООП показал выше.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[5]: [Haskell] Самый красивый код
От: thesz Россия http://thesz.livejournal.com
Дата: 18.05.09 08:42
Оценка:
V>>>Намекаешь на сложность восприятия рекурсивных типов?
T>>Это не рекурсивный тип в твоём понимании, что ты высказал ниже.
V>Это рекурсивный тип в понимании рекурсивного типа, а не в том, что ты увидел ниже.

Короче, ты решил стоять на своём. Это небезопасно для здоровья, и даже использовалось в качестве пыток, ты об этом знаешь?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[6]: [Haskell] Самый красивый код
От: vdimas Россия  
Дата: 18.05.09 08:50
Оценка:
Здравствуйте, thesz, Вы писали:

V>>Это рекурсивный тип в понимании рекурсивного типа, а не в том, что ты увидел ниже.


T>Короче, ты решил стоять на своём. Это небезопасно для здоровья, и даже использовалось в качестве пыток, ты об этом знаешь?


Ну ты же не ответил на вопрос, вместо этого попытался обсуждать терминологию, а это действительно бывает опасно.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re: [Haskell] Самый красивый код
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.06.09 12:23
Оценка:
Еще одна вещь, которая меня на днях очень впечатлила:
В классе Foldable t есть методы:
foldMap :: Monoid m => (a -> m) -> t a -> m
foldr :: (a -> b -> b) -> b -> t a -> b


Каждый из них имеет реализацию по умолчанию, выражающуюся через другой метод (таким образом, при определении инстанса класса достаточно реализовать любой из них). Так вот foldr очень красиво выражается через foldMap. Если вы ее не видели или не помните, то рекомендую попробовать написать ее самостоятельно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.