2015-09-16 111 views
3

我正在做一些CS作业,这是我与Haskell的第一次经历,所以我有一个问题。在Haskell中检查函数

我声明了一个数据类型

data Date = Date Int Int Int deriving (Show) 

,我有这个功能testdate:

testdate :: Date -> Maybe Date 
testdate (Date m d y) = if 1 <= m && m <= 12 && 1 <= d && d <= 31 && y >= 0 
    then 
     True 
    else 
     False 

我要作出这样的检查,看看是否testdate是真的还是假的新功能,然后返回日期。 类似的东西:

betterdate :: Date -> Maybe Date 
betterdate (Date m d y) if (testdate = True) //I know this part doesn't work 
    then Just (Date m d y) 
    else Nothing 

我该怎么做?

+5

你没有了'如果需要..然后在'testdate'的定义中返回True else False。 1&lt;&lt; && && && y&gt; = 0'表达式自己评估为“真”或“假”,所以你的函数可以是这样的。 – jwodder

+0

另外,当你比较两件事情时,你使用'=='而不是'='的等号运算符。你也在比较一个函数和Bool,这是没有意义的(因为在它不检查类型)。你可能打算做'testdate(Date m d y)== True'。 – Emil

+1

函数'testDate'具有错误的类型:声明返回'Maybe Date',但实际返回'Bool'。你需要给它正确的类型(或者完全省略这个类型让haskell为你推断)才能使用它。 – amalloy

回答

5

你想把你的日期传递给testdate函数。这应该工作:

betterdate d = if testdate d 
    then Just d 
    else Nothing 

如果你真的想解开的参数列表中的Date那么你可以这样做是为了避免重复(Date m d y) everwhere:

betterdate [email protected](Date m d y) = if testdate date 
    then Just date 
    else Nothing 
+0

@Guvante:谢谢,更新。 – Claudiu

+0

非常感谢!没有意识到它会如此简单。感谢帮助 –

+2

更高版本:'betterdate = mfilter testdate。 Just'。 ('mfilter'在'Control.Monad'中。) –