Haskell 对在函数调用期间使用'other'和多次使用'Right'感到困惑` 这是第一个函数
获取布尔值列表,在检查奇偶校验后将其转换为数字Haskell 对在函数调用期间使用'other'和多次使用'Right'感到困惑` 这是第一个函数,haskell,Haskell,获取布尔值列表,在检查奇偶校验后将其转换为数字 ePbs2i :: [Bool] -> Int ePbs2i bs | parity bs = bitstring2int bs ePbs2i[True,True]3 ` 这里是第二个使用或 ePbs2iE::Error[Bool]->Error Int ePbs2iE(左消息)=左消息 ePbs2iE(右bs)|奇偶校验bs=右(bitstring2int bs) |否则=左“输入具有奇偶校验” 这是我教授的成绩表。首先,我不明白你怎
ePbs2i :: [Bool] -> Int
ePbs2i bs | parity bs = bitstring2int bs
ePbs2i[True,True]
3
`
这里是第二个使用或
ePbs2iE::Error[Bool]->Error Int
ePbs2iE(左消息)=左消息
ePbs2iE(右bs)|奇偶校验bs=右(bitstring2int bs)
|否则=左“输入具有奇偶校验”
这是我教授的成绩表。首先,我不明白你怎么能把一个变量msg
随机放置,以及它在做什么。第二,为什么有这么多左撇子。不应该覆盖所有内容吗。为什么输入和函数bitstring2int bs
它似乎可以编译所有内容,但只要我尝试*Filename>ePbs2iE[True,True]
我就会收到这个错误
*Filename> ePbs2iE [True, True]
<interactive>:69:9: error:
• Couldn't match type ‘[Bool]’ with ‘Either String [Bool]’
Expected type: Error [Bool]
Actual type: [Bool]
• In the first argument of ‘ePbs2iE’, namely ‘[True, True]’
In the expression: ePbs2iE [True, True]
In an equation for ‘it’: it = ePbs2iE [True, True]
*Filename>ePbs2iE[True,True]
:69:9:错误:
•无法将类型“[Bool]”与“任一字符串[Bool]”匹配
预期类型:错误[Bool]
实际类型:[Bool]
•在“ePbs2iE”的第一个参数中,即“[True,True]”
在表达式中:ePbs2iE[True,True]
在“it”的等式中:it=ePbs2iE[True,True]
我试着看了很多不同的书或网站。如果有人能将我链接到一个也能回答这个问题的来源,那将是一个很好的解决其他问题的来源。另外,我觉得这涉及到了另一个话题,而不仅仅是或者这个问题在Haskell和其他语言之间提出了一些有趣的差异。从这个问题很难看出你是什么,也不清楚,所以我会尽可能地解释代码
首先,为什么要使用或
如果将奇数奇偶校验值传递给ePbs2i
,会发生什么情况
你会得到一个错误。更糟糕的是,错误将在运行时抛出,而调用ePbs2i
的函数将看不到它的出现
这就是所谓的部分函数——一个没有为所有可能的输入定义的函数,这是我们在Haskell中试图避免的
输入或类型<代码>或
定义为:
数据a或b=左a |右b
i、 e.它可以保存a
或b
的值。这用于指示失败的计算和其他错误。按照惯例,成功的结果由右侧
表示,失败的结果由左侧
表示
此代码中的错误a
与任一字符串a
相同
我们可以这样使用:
ePbs2iE1::[Bool]->任意字符串Int
EPBS2IE1BS
|奇偶校验bs=右侧(bitstring2int bs)
|否则=左“输入具有奇偶校验”
这意味着:
如果奇偶校验成功,则返回带有位字符串的Right
。如果失败,则返回带有错误消息的Left
现在,调用方被迫处理错误情况。只能在使用模式匹配时获取位字符串:
案例ePbs2iE1位
左整数->doSomeThingWithInt整数
右消息->报告错误消息
模式匹配绑定变量int
和msg
,因此int
可以用作Left int
箭头右侧的变量,而msg
可以用作right msg
箭头右侧的变量,但反之亦然
我们现在已经实现了一个总函数——一个定义在所有输入上的函数
但是功能ePbs2iE
更进一步。除了返回类型为other Int
的值外,它还接受类型为other[Bool]
的值。换句话说,ePbs2iE
期望产生传入的[Bool]
的计算本身可能失败,因此它准备处理失败
因此,ePbs2iE的工作原理如下:
- 首先,在传入的
或[Bool]
上进行模式匹配(第一个左
/右
,在行首)。
- 如果它是
左侧的
,即带有错误消息的错误条件,则将其传递出去
- 如果它收到指示成功的
右
,则:
- 将
[Bool]
绑定到bs
,并检查奇偶校验
- 如果为偶数,则使用整数返回success(
Right
)
- 如果为奇数,则失败,左侧
显示错误消息
因此,左边的Right
/left
与传入数据进行模式匹配,右边的指定输出
当然,由于ePbs2iE
的参数类型现在已从[Bool]
更改为任一字符串[Bool]
,因此不能再向其传递[Bool]
。一旦您学会阅读GHC错误信息,它会告诉您:
• Couldn't match type ‘[Bool]’ with ‘Either String [Bool]’
Expected type: Error [Bool]
Actual type: [Bool]
要使用此函数,只需将参数包装在右侧
,以指示有效值,如下所示:ePbs2iE(右侧[True,True])
随着您对Haskell的进一步了解,我相信您将了解到一种将或值链接在一起的更优雅的解决方案:the
哈斯凯林快乐 Error[Bool]
和[Bool]
是不同的类型。是什么让你认为你可以用[Bool]
调用ePbs2iE
?你可以使用msg
,因为如果你可以将输入与Left msg
匹配,它将被绑定-假设你做了ePbs2iE(Left“hey”)
,那么第一个模式将匹配,msg
将是“hey”
在expressinLeft msg
(右侧)-因此基本上返回相同的错误(但这次是作为error Int
的值,而不是E