Haskell: Показать завинченный?

Полночь в начале первого дня текущего месяца определяется по формуле:

// first midnight in this month
DateMidnight first = new DateMidnight().withDayOfMonth(1);

// last midnight in this month
DateMidnight last = first.plusMonths(1).minusDays(1);

При запуске с java.util.Date используется другой конструктор DateMidnight:

// first midnight in java.util.Date's month
DateMidnight first = new DateMidnight( date ).withDayOfMonth(1);

Joda Time java doc - https://www.joda.org/joda-time/apidocs/overview-summary.html

8
задан Lucky 9 June 2009 в 14:12
поделиться

6 ответов

Контракт метода show в Haskell заключается в том, что он создает строку, которая при вычислении дает то значение, которое было показано.

Prelude> let str = "stack\n\noverflow"
Prelude> putStrLn str
stack

overflow
Prelude> putStrLn (show str)
"stack\n\noverflow"
Prelude> 
15
ответ дан 5 December 2019 в 05:46
поделиться

Похоже, вы пытаетесь имитировать метод ToString, хотя некоторые из ваших терминов немного сбивает с толку.

Вы можете смоделировать это следующим образом:

{-# LANGUAGE UndecidableInstances, OverlappingInstances,
             FlexibleInstances, TypeSynonymInstances #-}

class ToString a where
    toString :: a -> String

instance ToString String where
    toString = id

instance Show a => ToString a where
    toString = show

Однако, как показано прагмами LANGUAGE, это не очень желательно. Было бы легче понять, что вы пытаетесь сделать, если бы у нас было больше контекста ...

9
ответ дан 5 December 2019 в 05:46
поделиться

show показывает переменную в том виде, в каком вы ее ввели.

Мне кажется довольно обычным.

3
ответ дан 5 December 2019 в 05:46
поделиться

План Поргеса работает, и я думаю, он раскрывает то, что show на самом деле задумано, поскольку сбивающее с толку поведение, которое вы обнаружили в ghci, все равно проявится, если вы получите желаемую функцию ввода-вывода. Обратите внимание, что я добавил экземпляр для Char в код Porges, поскольку вы, вероятно, хотели бы, чтобы он не содержал кавычек.

{-# LANGUAGE UndecidableInstances, OverlappingInstances,
         FlexibleInstances, TypeSynonymInstances #-}
class ToString a where
  toString :: a -> String

instance ToString String where
  toString = id

instance ToString Char where
  toString x = [x]

instance Show a => ToString a where
  toString = show

foo :: (ToString a) => a -> IO ()
foo x = do {putStrLn $ toString x}

затем в ghci посмотрите, что происходит с foo.show :

*Main> let str =  "stack\n\noverflow"   
*Main> show str   
"\"stack\\n\\noverflow\""    
*Main> putStrLn str   
stack  

overflow  
*Main> putStrLn (show str)  
"stack\n\noverflow"  
*Main> foo str   
stack  

overflow  
*Main> foo (show str)  
"stack\n\noverflow"  
*Main> foo ( show (show str))  
"\"stack\\n\\noverflow\""  
*Main> let newl = "\n"  
*Main> foo newl  


*Main> putStrLn newl  


*Main> putStrLn (show newl)  
"\n"   



*Main> foo (show newl)  
"\n"  
*Main> foo (show (show newl))  
"\"\\n\""  
*Main> 
1
ответ дан 5 December 2019 в 05:46
поделиться

Я не совсем уверен в том, что вы пытаетесь сделать. Было бы полезно, если бы вы немного разъяснили. Шоу делает то, что должно делать. Show просто создает строку, содержащую то, что было показано.

1
ответ дан 5 December 2019 в 05:46
поделиться

«какая функция похожа на show , но может возвращать строки, содержащие символы новой строки?»

Ответ: id

0
ответ дан 5 December 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: