Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中,当输入值是Float类型而不是Integer类型时,如何创建错误消息_Haskell_Error Handling_Floating Point_Integer - Fatal编程技术网

在Haskell中,当输入值是Float类型而不是Integer类型时,如何创建错误消息

在Haskell中,当输入值是Float类型而不是Integer类型时,如何创建错误消息,haskell,error-handling,floating-point,integer,Haskell,Error Handling,Floating Point,Integer,对于一个学校作业,我的任务是创建一个函数,确定一年是否是闰年 以下是我到目前为止的情况。e、 g当我输入“2018年的天数”时,返回“非闰年”。此函数仅适用于整数值输入。我需要一些额外的代码,当输入值是双精度或浮点值时,这些代码将返回错误消息 days_in_Year :: Integer -> String days_in_Year year | year `mod` 400 == 0 = "Leap Year" | year `mod` 100 == 0 = "Non-Leap Y

对于一个学校作业,我的任务是创建一个函数,确定一年是否是闰年

以下是我到目前为止的情况。e、 g当我输入“2018年的天数”时,返回“非闰年”。此函数仅适用于整数值输入。我需要一些额外的代码,当输入值是双精度或浮点值时,这些代码将返回错误消息

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"

我希望我的函数能够在输入为双精度或浮点值时返回“无效输入”…

Haskell的主要优点之一是类型系统强制区分“纯”函数和“不纯”函数。你得到的是一个纯函数——你保证给它一个
整数
,这个函数保证总是给你一个好的结果(没有错误)。(由于Haskell是一种静态类型语言,因此这些承诺在编译时由编译器以契约形式强制执行。)这使得代码更容易推理。虽然您确实需要处理用户输入行为不好时会发生的情况,并且可以修改函数(以及它的类型签名),但最好将代码放在其他地方,比如解析用户输入的地方

这就引出了一个问题,您如何获得用户输入,使其可能是
整数
浮点
双精度
?一个简单的模式类似于eg

import Text.Read

main = do
    s <- getLine
    case readMaybe s of
        Nothing -> putStrLn "Please enter an integer"
        Just x -> putStrLn $ days_in_Year x
导入文本。读取
main=do
s putStrLn“请输入一个整数”
仅x->x年中的putStrLn$days

在这里,因为
x
是作为
days\u in_Year
的参数提供的,所以编译器知道您正在尝试将字符串
s
作为
整数来读取,如果不能(例如,因为
s==“5.0”
),然后它只会返回
Nothing
,您可以告诉用户出了什么问题。

您的输入验证需要转到您输入的地方,您还没有向我们展示。它不能进入这个功能;太晚了!您在类型批注中指定了一个
Integer
输入,因此,如果您尝试传递任何其他内容,编译器将已经给您一个关于它无效的错误。非常感谢!我很抱歉,但我是haskell的新手,我不太确定如何将其直接实现到我的代码中。。。你能给我看看吗?@laurensoonink我编辑过它,应该是
getLine
而不是
readLn
对不起。虽然函数实际上是纯函数,但这在这里并不重要。关键是Haskell是静态类型的,这意味着编译器将捕获任何试图将非
整型
值作为参数传递给
days\u in_Year
,而不是函数必须在运行时检测传递给它的值的类型。@chepner我认为这在这里很重要。您的意思是,修复了函数类型后,编译器会捕获任何传递错误参数类型的尝试,因此错误会在编译时发生。我的主观观点是,检测错误输入的运行时错误属于不同的函数(虽然您可以修改函数以接受字符串并在此处进行错误处理,但不应该这样做!因此函数应该保持纯净)。@chepner也许我混淆了这两个函数,为了清晰起见,对其进行了编辑。