1. Haskell / Говнокод #12738

    −96

    1. 1
    2. 2
    instance Show (a -> b)
    main = print (*)

    http://liveworkspace.org/code/17QAgf$23
    stderr:
    Stack space overflow: current size 8388608 bytes.
    Use `+RTS -Ksize -RTS' to increase it.

    Возможно это из-за того, что нет реализации show и я написать вменяемую не смогу. Как заставить Haskell сгенерировать для меня show?

    Хочется типа такого:

    {-# LANGUAGE OverlappingInstances, FlexibleInstances, UndecidableInstances, StandaloneDeriving, DeriveFunctor #-}
    deriving instance Show (a -> b)
    main = print (*)

    http://liveworkspace.org/code/17QAgf$21
    http://www.haskell.org/ghc/docs/6.12.1/html/users_guide/deriving.html
    http://www.haskell.org/haskellwiki/GHC/Stand-alone_deriving_declarations

    Запостил: HaskellGovno, 13 Марта 2013

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

    • instance Show (a -> b) where
          show _ = "ko"
      main = print $ (*)

      Какого хрена?
      (*) имеет тип a -> a -> a
      А я объявлял для a -> b.

      PS: Все верно. Туплюc. a -> (a -> a), что есть a -> b
      Ответить
    • Опять ты на те же грабли наступаешь.
      У show 3 метода объявлены, которые выражаются друг через друга. Не объявишь хотя бы один из них - получаешь бесконечную рекурсию.

      КоКоКочешь текстового представления для функций - тебе в JS.
      Ответить
      • deriving (Show) дает возможность компилятору самостоятельно создать компилятору реализацию метода show. Как в в случае с (->) заставить компилятор реализовать Show::show самостоятельно или что-то боле вменяемое, чем получение константы, как в коде show _ = "ko" выше?
        Ответить
        • Рефлективности захотелось? В крестах-то ты как operator>> реализуешь для функций (без шаблонов)?
          http://www.haskell.org/haskellwiki/Show_instance_for_functions
          Ответить
        • Не, ну правда, что бы ты хотел, чтобы она выводила для каждой из функций?
          Ответить
          • Лямбду или хотя бы тип. То что сделал Роман - хак пригодный разве что для гк треда
            Ответить
            • Какую, простите, лямбду? С исходным кодом? До или после оптимизации? Комментарии и форматирование сохранять? А если его уже нет, а есть бинарная библиотека?
              А для получения типа есть Typeable, см. ниже.
              Ответить
              • Спасибо, Yuuri.
                Остановился на:
                --{-# LANGUAGE DeriveDataTypeable #-}
                import Data.Typeable
                
                instance (Typeable a, Typeable b) => Show (a -> b) where
                    show = show . typeOf
                 
                instance (Typeable a) => Show (IO a) where
                    show = show . typeOf
                 
                f :: Double -> Int
                f _ = 0
                 
                main = do
                     print f
                     print putStrLn
                     print getLine
                     print (putStrLn "Hi")
                     print $ ((*)::Int->Int->Int)

                http://liveworkspace.org/code/3Sjlvq$0
                Ответить
    • http://ideone.com/20Wpes
      кресты снова "рвут" хаскелл со свойственной им лаконичностью?
      Ответить
      • что мешало поиграть с variadic templates?
        template <class R, class... Args>
        std::ostream & operator << (std::ostream & o, R (*)(Args...)) { ...
        Ответить
      • Ну, так мы тоже могём: http://ideone.com/YIKmDZ
        Ответить
        • С unboxed типами небось не работает?
          Ответить
          • Увы. Но это компилятороспецифичные штучки, GHC.Prim и {-# LANGUAGE MagicHash #-}. А вот Typeable — в стандарте.
            Ответить
    • Хаскель на свете, ты один есть у Гумна,
      Хаскель на свете, ты с Гумном день ото дня.
      Пиши, не бойся, GHC есть там где ты,
      И говно по интернету собираешь как цветы.
      Ответить

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