Function 哈斯克尔写作课基础

Function 哈斯克尔写作课基础,function,class,haskell,Function,Class,Haskell,我经常遇到这个问题,我正在努力学习Haskell,现在正在学习课程。我试着做一个函数,输入三个数字,如果它们相等,则返回一个真布尔,否则返回一个假布尔 我知道我需要这样的课程: allTheSame :: a -> a -> a -> Bool min3 x y z = min x $ min y z 然而,我经常感到困惑,写了之后,我应该在函数本身中放些什么 allTheSame x y z = 我以前写过一个函数,关于显示一个3变量函数的最小值,我遇到过这个问题。我

我经常遇到这个问题,我正在努力学习Haskell,现在正在学习课程。我试着做一个函数,输入三个数字,如果它们相等,则返回一个真布尔,否则返回一个假布尔

我知道我需要这样的课程:

allTheSame :: a -> a -> a -> Bool
min3 x y z = min x $ min y z
然而,我经常感到困惑,写了之后,我应该在函数本身中放些什么

allTheSame x y z = 
我以前写过一个函数,关于显示一个3变量函数的最小值,我遇到过这个问题。我通过两次使用base min函数实现了这一点,如下所示:

allTheSame :: a -> a -> a -> Bool
min3 x y z = min x $ min y z
但是,当没有基函数可使用时,我该如何做呢?我真的很感激,因为我已经为这个问题挂了好几个小时了


谢谢你

那么您需要使用
==
,所以我们的类型是

 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
您使用的单词class不正确。在Haskell中,类(有时称为typeclass)是类型必须支持的函数规范,有点像OOP中的接口。你需要的是一个函数。函数将值作为参数,在本例中,您需要一个函数,该函数接受3个数字并检查它们是否都相同。您使用什么函数(或运算符,它们也是函数)检查相等性?
=
运算符就是您要查找的

那么如何使用
=
操作符呢?查找的简单方法是加载GHCi并输入

> :type (==)
(==) :: Eq a => a -> a -> Bool
(不要键入
>
,它表示输入的开始)

这个
Eq a=>
在类型签名中做什么?这意味着
=
接受两个类型为
a
的参数,它们实现了
Eq
typeclass。这是对
allSame
函数所需的唯一约束,因此要修复类型签名:

allSame :: Eq a => a -> a -> a -> Bool
allSame x y z = ???
这个小小的改变改变了整个世界,没有它你就无法编写这个函数

那么您将如何实现它呢?
=
函数只接受两个参数并返回一个
Bool
,您有三个参数。我们需要检查一下

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)

我的Haskell有点生锈了,但我希望我能给你指出正确的方向

给定签名
allTheSame::a->a->a->Bool
xyz in将是前3个a,最后的值将是Bool,因此类似于
allTheSame xyz=True

我认为可能会让你困惑的是Haskell并不是真正用于程序操作的。一切都必须“同时”计算。但是,您可以组织您的逻辑,这样它就不会与
where
子句和卫士等内容放在同一行中

例:这个:

allSame :: (Eq a) => a -> a -> a -> Bool

allSame x y z = fstSame && sndSame
                where
                    fstSame = x == y
                    sndSame = y == z

你可能会找到一些更有用的方法来组织,而且它总是很有洞察力。

听说过if-else语句吗?我不是反对者,但这个问题和上一个问题看起来像是你在用SO来为你做功课。请注意,太多低质量的问题可能会导致问题禁令。有一个基本函数可供使用。它叫(=)。试着用蹄声发出一声->一声->嘘声。