Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 对在函数调用期间使用'other'和多次使用'Right'感到困惑` 这是第一个函数_Haskell - Fatal编程技术网

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”
在expressin
Left msg
(右侧)-因此基本上返回相同的错误(但这次是作为
error Int
的值,而不是
E