Haskell 将Int与Bool的数据类型匹配

Haskell 将Int与Bool的数据类型匹配,haskell,Haskell,我想创建一个新的[Int]或空的数据类型;然后我想使用Int并检查数据类型是否包含Int。这可能是一个非常简单的问题,但我不熟悉创建数据类型并在函数中使用它们,特别是掌握语法;我对它还没有一个有根据的理解 data New = New [Int] | Empty deriving Show check :: Int -> New -> Bool check x ys | x `elem` New ys = True | otherwise = Fal

我想创建一个新的[Int]或空的数据类型;然后我想使用Int并检查数据类型是否包含Int。这可能是一个非常简单的问题,但我不熟悉创建数据类型并在函数中使用它们,特别是掌握语法;我对它还没有一个有根据的理解

data New = New [Int]
         | Empty
    deriving Show

check :: Int -> New -> Bool
check x ys
 | x `elem` New ys = True
 | otherwise  = False

您需要在其
New
参数上选中
check
进行模式匹配,以访问基础列表(如果有)

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

check :: Int -> New -> Bool
check x ys = x `elem` (case ys of
                         New ys' -> ys'
                         Empty -> []) 

尽管这是一个使用自定义数据类型的练习,但我还是想继续讨论chepner的问题,“什么是
空的
提供了
New[]
不提供的?”因为没有得到任何响应:列表可能已经是空的,因此您可以在没有自定义数据类型定义的情况下进行检查:

check :: Int -> [Int] -> Bool
check = elem
Robin所说的类型与您的
新类型
同构,
可能
,它看起来像:

type New = Maybe [Int]

check :: Int -> New -> Bool
check _ Nothing = False
check x (Just xs) = x `elem` xs
通常,当标准库提供与当前数据类型同构的数据类型时,您应该问问自己是否要创建自己的数据类型。有时它是有保证的,但通常您希望使用
类型
新类型
,而不是
数据

对于这种类型,
可能[Int]
,您必须问自己为什么要区分
仅[]
。例如,
Nothing
可能表示函数失败,而
Just[]
可能表示函数成功,但(正确的)结果为空

有意义的函数示例如下:

正确确定给予客户的最少硬币数量,使硬币价值之和等于正确的兑换金额

这里的
表示不可能给出准确的零钱,
Just[]
表示客户支付了准确的金额,不需要零钱


相反,如果您想要一些关于为自定义数据类型编写函数的练习,请参阅上的“W3”练习。

什么是
Empty
提供的
New[]
没有提供的?值得注意的是,您的
New
类型本质上与
相同(“同构”),可能[Int]
New有一个[Int]arg while Empty没有args。因此我必须在定义中同时处理New[Int]和Empty?我的意思是,您是否有需要区分no list和Empty list的情况?为了测试这一点,我编写
检查1(New[1,2,3])
,然后返回True。我的问题是:我在测试中使用的新构造函数是类型构造函数,而不是同名的数据构造函数?@bingobono在该行中使用的
New
就是数据构造函数。类型构造函数大多只用于类型注释。非常感谢,这确实帮助我理解了语法。在您习惯使用类型构造函数的位置和数据构造函数的位置之前,您可能需要为每个类型使用不同的名称:
data New=NewList[Int]| Empty
。谢谢!这是一个非常有用的参考资料。