Haskell 将Int与Bool的数据类型匹配
我想创建一个新的[Int]或空的数据类型;然后我想使用Int并检查数据类型是否包含Int。这可能是一个非常简单的问题,但我不熟悉创建数据类型并在函数中使用它们,特别是掌握语法;我对它还没有一个有根据的理解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
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
。谢谢!这是一个非常有用的参考资料。