将Int与Bool的dataType匹配

时间:2019-03-20 20:59:34

标签: haskell

我想创建一个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

2 个答案:

答案 0 :(得分:4)

您希望charset对其check参数进行模式匹配以访问基础列表(如果有)。

New

稍微松开定义的一种方法是认识到就check :: Int -> New -> Bool check x Empty = False check x (New ys) = x `elem` ys 而言,值checkEmpty是等效的。

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

通常,当标准库提供与当前库同构的数据类型时,您应该问自己是否要创建自己的库。有时是有保证的,但通常您会想使用typenewtype而不是data

使用Maybe [Int]这种类型时,您必须问自己为什么要区分NothingJust []。例如,Nothing可以指示函数失败,而Just []可以指示函数成功,但是(正确)结果为空。

一个有意义的函数示例为the Change exercise on Exercism

  

正确确定要提供给客户的硬币数量最少,以使硬币总和等于正确的找零额。

此处Nothing表示无法进行准确的更改,而Just []则表示客户已支付了准确的金额,不需要更改。

相反,如果您想要一些处理针对自定义数据类型编写函数的练习,请参见https://github.com/opqdonut/haskell-exercises上的“ W3”练习。