Haskell写作类基础知识

时间:2014-04-03 12:43:52

标签: function class haskell

我经常遇到这个问题我正在努力学习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!

3 个答案:

答案 0 :(得分:4)

您对 class 一词的使用不正确。在Haskell中,有时称为类的类或类类是类型必须支持的函数的规范,有点像OOP中的接口。您需要的是功能。函数将值作为参数,在这种情况下,您需要一个需要3个数字的函数并检查它们是否完全相同。您使用什么函数(或运算符,也是函数)来检查是否相等? ==运算符是您正在寻找的。

那你如何使用==运算符?找出的简单方法是加载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 == yy == z,那么x == z也是如此,所以你不需要检查所有三个,只是他们两个人。所以现在我们知道我们的定义必须在其中包含表达式x == yy == 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 = ???

现在我们可以测试xy是否与x == y相等。我们有

 allSame x y z = if x == y then ??? else False

其中???表示xy相同,我们需要确保xz相同。

 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总是很有见地。