我想创建一个New [Int]或Empty的数据类型;那么我想使用一个Int并检查数据类型是否包含Int。这可能是一个非常简单的问题,但是我是创建数据类型并在函数中使用它们的新手,尤其是获取语法的句柄。我对它还没有扎实的了解。
data New = New [Int]
| Empty
deriving Show
check :: Int -> New -> Bool
check x ys
| x `elem` New ys = True
| otherwise = False
答案 0 :(得分:4)
您希望charset
对其check
参数进行模式匹配以访问基础列表(如果有)。
New
稍微松开定义的一种方法是认识到就check :: Int -> New -> Bool
check x Empty = False
check x (New ys) = x `elem` ys
而言,值check
和Empty
是等效的。
New []
答案 1 :(得分:0)
即使这是使用自定义数据类型的练习,但我还是想扩展一下chepner的问题:“ Empty
提供了什么New []
没有提供什么?”由于未收到任何响应:列表可能已经为空,因此您可以在没有自定义数据类型定义的情况下进行检查:
check :: Int -> [Int] -> Bool
check = elem
Robin所说的类型与您的New
类型Maybe
是同构的,如下所示:
type New = Maybe [Int]
check :: Int -> New -> Bool
check _ Nothing = False
check x (Just xs) = x `elem` xs
通常,当标准库提供与当前库同构的数据类型时,您应该问自己是否要创建自己的库。有时是有保证的,但通常您会想使用type
或newtype
而不是data
。
使用Maybe [Int]
这种类型时,您必须问自己为什么要区分Nothing
和Just []
。例如,Nothing
可以指示函数失败,而Just []
可以指示函数成功,但是(正确)结果为空。
一个有意义的函数示例为the Change exercise on Exercism:
正确确定要提供给客户的硬币数量最少,以使硬币总和等于正确的找零额。
此处Nothing
表示无法进行准确的更改,而Just []
则表示客户已支付了准确的金额,不需要更改。
相反,如果您想要一些处理针对自定义数据类型编写函数的练习,请参见https://github.com/opqdonut/haskell-exercises上的“ W3”练习。