我是Haskell的新手,想了解创建函数的几点建议。我习惯用C#,Java和C ++编写,所以这些东西对我来说真的很陌生。
以下是我正在处理的问题:
声明类型并在Haskell中编写一个需要三个的函数 数字作为输入并返回较大的数字。写两个版本 这个功能:首先使用if else和second use guard。
在第一个工作中,我想出了类似的东西......:
largestInt :: Int -> Int -> Int --Declaring type
largestInt a b c = if (a > b && a > c) then a --I don't think this is right, but it's all I have
else if (b > a && b > c) then b
else c
我一直在使用this视频寻求帮助,但由于某些原因我无法做同样的事情。 (这意味着我无法创建Main.hs文件)
我正在使用WinGHCi
如果有人可以告诉我如何设置功能,甚至可以在Haskell中使用这个,以便我知道将来我在做什么,我将不胜感激。非常感谢你。
更新
-added else
代码
- 固定的最后if
声明
截图:
答案 0 :(得分:3)
添加到J的答案,我已经完成了你的功能。这会改变您的功能以使用穷举模式(如J所述),并且还会更正类型签名,该签名仅接受2个Ints。使用if
语句:
largestInt :: Int -> Int -> Int -> Int
largestInt a b c = if (a >= b && a >= c)
then a
else if (b >= a && b >= c)
then b
else c
对于守卫(顺便说一句,这是一个更好的方法):
largestInt :: Int -> Int -> Int -> Int
largestInt a b c
| (a >= b && a >= c) = a
| (b >= a && b >= c) = b
| otherwise = c
如果您将其直接放入GHCI,您可以这样做:
{largestInt :: Int -> Int -> Int -> Int;largestInt a b c ; | (a > b && a > c) = a |(b > a && b > c) = b |otherwise = c}
你可能需要在每个守卫之前添加分号,但我相信这并不重要。这是在GHCI中定义多行函数的一般语法。
答案 1 :(得分:1)
Haskell中的所有内容都是一个表达式,因此必须产生一个值。您编写的代码涉及三个“半” - if
s,其中没有一个解析为值。例如,只考虑一个“半” - if
:
if (a > b) then c
我们可以用(a > b)
和True
替换False
,看看会发生什么。如果我们使用True
,则很明显该值为
if True then c ====> c
但是如果我们使用False
if False then c ====> ?
换句话说,如果他们的条件评估为if
,那么“一半” - False
没有多大意义。因此,在Haskell中,所有if
必须是“完整的”if
s,即。他们必须始终拥有then
和 else
分支。
if (a > b && a > c)
then a
else if (b > a && b > c)
then b
else if (c > a && c > b)
then c
else ...?
在最后一个例子中概述了Haskell要求“完整”if
的部分原因 - 它有助于避免上述推理中的错误,我们无法确定第三个分支将始终为真,除非我们检查一下。
事实上,你所写的内容必须一直到最后才会出现类似
的内容largestInt 0 0 0
因为实际上没有任何参数是最大的!