Function 哈斯克尔写作课基础
我经常遇到这个问题,我正在努力学习Haskell,现在正在学习课程。我试着做一个函数,输入三个数字,如果它们相等,则返回一个真布尔,否则返回一个假布尔 我知道我需要这样的课程: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变量函数的最小值,我遇到过这个问题。我
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来为你做功课。请注意,太多低质量的问题可能会导致问题禁令。有一个基本函数可供使用。它叫(=)。试着用蹄声发出一声->一声->嘘声。