Как создать сообщение об ошибке, когда входное значение имеет тип Float, а не тип Integer в Haskell - PullRequest
0 голосов
/ 30 марта 2019

Для школьного задания мне было поручено создать функцию, которая определяет, является ли год високосным или нет.

Ниже то, что у меня есть.Например, когда я набираю «days_in_Year 2018», он возвращает «Non-високосный год».Эта функция работает только для ввода целочисленных значений.Мне нужен дополнительный код, который будет возвращать сообщение об ошибке, когда входное значение является двойным или плавающим.

days_in_Year :: Integer -> String
days_in_Year year
 | year `mod` 400 == 0 = "Leap Year"
 | year `mod` 100 == 0 = "Non-Leap Year"
 | year `mod` 4 == 0   = "Leap Year"
 | otherwise = "Non-Leap Year"

Я бы хотел, чтобы моя функция могла возвращать "Неверный ввод", когда вводится значение типа double или float ...

1 Ответ

4 голосов
/ 30 марта 2019

Одним из основных преимуществ Haskell является то, что система типов обеспечивает отличие «чистых» функций от «нечистых» функций. У вас есть чистая функция - вы обещаете дать ей Integer, а функция обещает всегда дать вам хороший результат (без ошибок). (Эти обещания исполняются на контрактной основе компилятором, т. Е. Во время компиляции, поскольку Haskell является языком статической типизации.) Это значительно упрощает анализ кода. Несмотря на то, что вам нужно разобраться с тем, что происходит, если ввод пользователя плохо ведется и может изменить функцию (и ее сигнатуру типа) для этого, рекомендуется размещать этот код в другом месте - например, там, где вы анализируете ввод от пользователя. ,

Возникает вопрос: как вы получаете ввод данных от пользователя, чтобы это могло быть Integer или Float или Double? Простой шаблон будет что-то вроде, например.

import Text.Read

main = do
    s <- getLine
    case readMaybe s of
        Nothing -> putStrLn "Please enter an integer"
        Just x -> putStrLn $ days_in_Year x

Здесь, поскольку x предоставляется в качестве аргумента для days_in_Year, компилятор знает, что вы пытаетесь прочитать строку s как Integer, и если это невозможно (например, потому что s == "5.0"), тогда он просто вернет Nothing, и вы сможете сказать пользователю, что пошло не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...