Полночь в начале первого дня текущего месяца определяется по формуле:
// 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
Контракт метода show в Haskell заключается в том, что он создает строку, которая при вычислении дает то значение, которое было показано.
Prelude> let str = "stack\n\noverflow"
Prelude> putStrLn str
stack
overflow
Prelude> putStrLn (show str)
"stack\n\noverflow"
Prelude>
Похоже, вы пытаетесь имитировать метод 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, это не очень желательно. Было бы легче понять, что вы пытаетесь сделать, если бы у нас было больше контекста ...
show
показывает переменную в том виде, в каком вы ее ввели.
Мне кажется довольно обычным.
План Поргеса работает, и я думаю, он раскрывает то, что 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>
Я не совсем уверен в том, что вы пытаетесь сделать. Было бы полезно, если бы вы немного разъяснили. Шоу делает то, что должно делать. Show просто создает строку, содержащую то, что было показано.
«какая функция похожа на show
, но может возвращать строки, содержащие символы новой строки?»
Ответ: id