Чтобы проиллюстрировать мнение Чепнера о classify
, верните список String
с вместо ввода-вывода:
import Data.List (tails)
classify :: String -> [String]
classify s = case take 3 s of
"123" -> return "True"
"234" -> return "False"
"456" -> return "maybe"
otherwise -> mempty
classifyAll :: String -> [String]
classifyAll s = tails s >>= classify
main :: IO ()
main = interact (unlines . classifyAll)
Выполнение этого,
$ stack ghc classify.hs
$ echo 123456 | ./classify
True
False
maybe
Я не могу выбрать, хочу ли я ставить \ n после печати или нет.
В принципе, это работает, но мы можем удалить \ n, если захотим?
Если вы хотите отделить что-то, отличное от перевода строки,
import Data.List (intercalate, tails)
...
main :: IO ()
main = interact ((++ "\n") . intercalate ", " . classifyAll)
Запустив это,
$ echo 123456 | ./classify
True, False, maybe
Разделение кода, который анализирует и печатает, также делает ваш код более легко тестируемым. Например,
spec_classify :: Spec
spec_classify =
describe "classify" $
it "classifies 123, 234 and 456" $
classifyAll "123456" `shouldBe` ["True", "False", "maybe"]
Проверка этого
$ stack ghci classify.hs
> hspec spec_classify
classify
classifies 123, 234 and 456
Finished in 0.0005 seconds
1 example, 0 failures