我经常遇到这个问题我正在努力学习Haskell,现在正在学习课程。我试图创建一个函数,你输入三个数字,如果它们彼此相等,那么返回一个True Bool else返回一个False Bool。
我知道我需要一个这样的课程:
allTheSame :: a -> a -> a -> Bool
然而,在编写
之后,我经常会对应该放在函数本身中的内容感到困惑allTheSame x y z =
我之前有过一个关于显示3变量函数最小值的函数的问题。我这样做了两次这样的基本min函数:
min3 x y z = min x $ min y z
但是如果没有基本功能可以使用,我该怎么做?我真的很感激,因为我已经把这个问题挂了好几个小时。
谢谢Allot!
答案 0 :(得分:4)
您对 class 一词的使用不正确。在Haskell中,有时称为类的类或类类是类型必须支持的函数的规范,有点像OOP中的接口。您需要的是功能。函数将值作为参数,在这种情况下,您需要一个需要3个数字的函数并检查它们是否完全相同。您使用什么函数(或运算符,也是函数)来检查是否相等? ==
运算符是您正在寻找的。 p>
那你如何使用==
运算符?找出的简单方法是加载GHCi并输入
> :type (==)
(==) :: Eq a => a -> a -> Bool
(不要输入>
,表示输入的开始)
此Eq a =>
在类型签名中做了什么?这意味着==
采用两个类型为a
的参数来实现Eq
类型类。这是allSame
函数所需的唯一约束,因此要修复类型签名:
allSame :: Eq a => a -> a -> a -> Bool
allSame x y z = ???
这个微小的变化使世界变得与众不同,如果没有它,你就无法写出这个功能。
那你将如何实现呢? ==
函数只接受两个参数并返回Bool
,并且您有3个参数。我们需要检查
x == y
x == z
y == z
但是,由于平等的传递属性,如果x == y
和y == z
,那么x == z
也是如此,所以你不需要检查所有三个,只是他们两个人。所以现在我们知道我们的定义必须在其中包含表达式x == y
和y == z
,但是它们需要组合在一起以产生单个结果。由于我们需要这两个条件都是真的,因此需要逻辑AND,即&&
运算符。最后,我们可以把它写成
allSame :: Eq a => a -> a -> a -> Bool
allSame x y z = (x == y) && (y == z)
答案 1 :(得分:3)
你需要使用==
所以我们的类型是
allSame :: Eq a => a -> a -> a -> Bool
allSame x y z = ???
现在我们可以测试x
和y
是否与x == y
相等。我们有
allSame x y z = if x == y then ??? else False
其中???
表示x
和y
相同,我们需要确保x
和z
相同。
allSame x y z = if x == y then x == z else False
这可以通过&&
到
allSame x y z = x == y && y == z
答案 2 :(得分:0)
我的Haskell有点生疏,但我希望我能指出你正确的方向。
鉴于签名allTheSame :: a -> a -> a -> Bool
x y z in将是前3个a,最终值将是bool,所以类似于allTheSame x y z = True
。
我认为可能让您感到困惑的是,Haskell并不是真正意义上的程序操作。必须“一次性”计算所有内容。但是你可以组织你的逻辑,所以它不是像where
条款和守卫这样的一行。
实施例。这一个:
allSame :: (Eq a) => a -> a -> a -> Bool
allSame x y z = fstSame && sndSame
where
fstSame = x == y
sndSame = y == z
您可能会在Learn You a Haskell's section on Syntax in Functions中找到一些更有用的结构方式,而且查看Haskell's Standard Prelude总是很有见地。