1. Куча / Говнокод #12068

    +129

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    -- Подготовка
    (.-) :: ot -> (ot -> rt) -> rt
    object .- method = method object
    
    to_string () self = show self
    
    my_array = [1..]
    
    -- ООП в действии
    main = putStrLn( my_array.-take(10).-drop(5).-to_string() )

    Хаскелл и ООП.

    Запостил: Fai, 07 Ноября 2012

    Комментарии (31) RSS

    • > my_array = [1..]
      > my_array
      Ответить
      • Мой массив!!!

        Добрался я таки до операторов, следующие в очереди - data, type, newtype.
        Ответить
        • Что читаешь? Реалворлдхаскель или лернхаскельфорю?
          Ответить
          • Learn You a Haskell for Great Good!

            RWH - сразу как закончу.
            Ответить
    • object .- method = method object
      Не по феншую. Почуствуй силу каррирования, Fai.
      (.-) = flip ($)
      Ответить
      • >Почуствуй силу каррирования, Fai.
        Он ещё спит. Всю ночь учил Хаскел. По себе знаю.
        Ответить
    • Ты уже дочитал до монды IO?
      Ответить
      • Блин, a зaлиплa...
        Ответить
      • Как ты посмел обозвать божественные монады хаскеля мондами... Повинен смерти!
        Ответить
      • До IO уже давно дочитал, до монад в общем недавно.

        Почему-то показалось, что это слишком просто.

        Единственное, хочу узнать, написан ли оператор do на самом хаскелле или он встроен, как например оператор "=".
        Ответить
        • > написан ли оператор do на самом хаскелле
          do это вообще сахарок для монадических операторов. Так что синтаксис встроен, а его алгоритм можешь написать ты сам, запилив свою монаду.
          Ответить
        • При разборе do нотации происходит вот такое преобразование: http://ideone.com/7AUWMg.

          P.S. Вроде бы все возможности do удалось показать в этом примере.
          Ответить
          • Очень красиво. ^_^

            А почему я не могу написать как-то так?
            class Named t where
                    name :: t -> String
            
            data Dog = Dog {name::String} deriving (Named)


            или

            class Named t where
                    name :: t -> String
            
            data Dog = Dog {name::String}
            
            instance Named Dog


            Ошибка
            Multiple declarations of `Main.name'
                Declared at:
            Ответить
            • Как-то так:
              class Named t where
                      name :: t -> String
              
              data Dog = Dog {name'::String}
              
              instance Named Dog
                  name = name'

              http://ideone.com/V3Q9UJ
              Других способов пока не вижу. Метод должен быть описан именно в инстансе.
              Ответить
              • До этого способа я догадался. Только имхо тогда уж проще написать так:
                class Named t where
                        name :: t -> String
                 
                data Dog = Dog String
                 
                instance Named Dog where
                    name (Dog n) = n
                
                
                http://ideone.com/6qnZUx
                Ответить
                • > Только имхо тогда уж проще написать так
                  Да.
                  Ответить
          • Я знаю, что такое do. Вопрос был в том, сделан ли он средствами самого хаскеля или вшит, также как if, case, (=) и некоторые другие.

            Как оказалось вшит.
            Ответить
            • >как if, case, (=) и некоторые другие.
              А разве они вшиты? Разве if нельзя реализовать средствами хаскела? Он вроде достаточно для этого ленивый.
              Ответить
              • Можно реализовать, но не в таком же виде:

                newIf True true_value _ = true_value
                newIf False _ false_value = false_value

                А вот именно в виде if ... then ... else ... - нельзя
                Ответить
              • У ифа особый синтаксис. Как ты его реализуешь? Разве что как выше написал Fai в виде обычной функции.

                Я всегда буду обновлять страницу перед отправкой.
                Я всегда буду обновлять страницу перед отправкой.
                Я всегда буду обновлять страницу перед отправкой.
                Ответить
    • Да чего уж мелочиться-то.
      {-# LANGUAGE OverlappingInstances, FlexibleInstances, UndecidableInstances #-}
      
      import Prelude hiding ((.))
      import System.IO
      
      (.) = flip ($)
      infixl 0 <<
      cout = return ()
      
      class Cout a where
          (<<) :: IO () -> a -> IO ()
      instance Cout [Char] where
          stream << str = stream >> putStr str
      instance (Show a) => Cout a where
          stream << val = stream >> putStr (show val)
      
      my_list = [1 :: Integer ..]
      data Point = Point {x, y :: Double}
      my_point = Point 1.0 0.0
      endl = "\n"
      
      main = do
      {
         cout << "Hello, world!\n";
         cout << my_list.take(10).drop(5) << endl;
         cout << my_point.x << "; " << my_point.y << endl;
         return ();
      }
      Ответить
      • Yuuri - мой нижегородский коллега, кстати.
        Ответить
      • Ха, а ещё можно дописать
        instance Num () where
           fromInteger _ = ()
        
        main :: IO ()

        и делать return 0;
        Ответить
        • А я уж думал все хаскелисты перевелись. Мода на хаскель на говнокоде прошла...
          Ответить
          • Даёшь вторую неделю ГК.hs!
            \me поборол стыд и для начала навыложил свой перл
            Ответить
    • Я достаточно долгое время живу за рубежом, поэтому как-то проще уделять время своим шалостям. Никто особо не третирует за вопрос бисексуальности, хотя и в самой моей бисексуальности есть тонкости.
      Ответить

    Добавить комментарий