Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 为什么可以';ghci是否与此类型匹配?_Haskell - Fatal编程技术网

Haskell 为什么可以';ghci是否与此类型匹配?

Haskell 为什么可以';ghci是否与此类型匹配?,haskell,Haskell,我正在学习-看这一章: 在ghci中运行以下代码时: type Birds = Int type Pole = (Birds,Birds) x -: f = f x :{ landLeft :: Birds -> Pole -> Maybe Pole landLeft n (left,right) | abs ((left + n) - right) < 4 = Just (left + n, right) | otherwise

我正在学习-看这一章:

在ghci中运行以下代码时:

type Birds = Int  
type Pole = (Birds,Birds)  

x -: f = f x

:{
landLeft :: Birds -> Pole -> Maybe Pole
landLeft n (left,right)
    | abs ((left + n) - right) < 4 = Just (left + n, right)
    | otherwise                    = Nothing
:}

:{
landRight :: Birds -> Pole -> Maybe Pole
landRight n (left,right)
    | abs (left - (right + n)) < 4 = Just (left, right + n)
    | otherwise                    = Nothing
:}

--Failure
(0,0) -: landLeft 1 -: landRight 4 
--(0,0) -: landLeft 1 -: landRight 4 -: landLeft (-1) -: landRight (-2)  
--(0,2)  
type Birds=Int
类型杆=(鸟,鸟)
x-:f=fx
:{
陆地左图:鸟->杆子->可能是杆子
左侧(左、右)
|abs((左+n)-右)<4=刚(左+n,右)
|否则=没有
:}
:{
土地使用权:鸟类->杆子->可能是杆子
右起落架(左、右)
|abs(左-(右+n))<4=正(左,右+n)
|否则=没有
:}
--失败
(0,0)-:土地所有权1-:土地所有权4
--(0,0)-:landLeft 1-:landRight 4-:landLeft(-1)-:landRight(-2)
--(0,2)  
我得到一个错误:

Prelude> (0,0) -: landLeft 1 -: landRight 4 

<interactive>:17:24: error:
    • Couldn't match type ‘Maybe Pole’ with ‘(Birds, Birds)’
      Expected type: Maybe Pole -> Maybe Pole
        Actual type: Pole -> Maybe Pole
    • In the second argument of ‘(-:)’, namely ‘landRight 4’
      In the expression: (0, 0) -: landLeft 1 -: landRight 4
      In an equation for ‘it’: it = (0, 0) -: landLeft 1 -: landRight 4
Prelude>(0,0)-:土地所有权1-:土地所有权4
:17:24:错误:
•无法将“可能杆”类型与“鸟,鸟”匹配
预期类型:可能杆->可能杆
实际类型:杆->可能杆
•在“(:)”的第二个参数中,即“土地权4”
在表达式中:(0,0)-:landLeft 1-:landRight 4
在“it”的方程式中:it=(0,0)-:landLeft 1-:landRight 4

我的问题是:为什么ghci不能匹配这种类型?

一起工作的
landLeft
landRight
的变体-:
使用
Pole
作为返回类型,而不是
可能的Pole
。让我们一次查看所有类型:

landLeft  1             ::       Pole -> Maybe Pole
landRight 4             ::       Pole -> Maybe Pole 
(-:)                    :: a -> (a    -> b         ) -> b
(0,0)                   :: Pole
(-:) (0,0)              ::      (Pole -> b         ) -> b
(-:) (0,0) (landLeft 1) ::                              Maybe Pole
由于
可能极
不是
,我们不能将
(:)
再次用于
土地权
。LYAH展示了如何处理这些函数:您需要一种方法将
a->Maybe b
函数与
Maybe a
一起使用。这就是
(>>=)
工作:

landLeft 1 (0,0) >>= landRight 4
继续本章,因为作者立即解决了您的问题:

当我们在没有使皮埃尔失去平衡的情况下降落鸟类时,我们得到了一根新的杆子,它被一个
包裹起来,只是
。但是当更多的鸟停在杆子的一侧时,我们得到的是一个
。这很酷,但是我们似乎已经失去了将鸟类反复降落在杆子上的能力。我们不能再做
landleft1(landRight 1(0,0))
,因为当我们将
landRight 1
应用于
(0,0)
时,我们不会得到
极点,但
可能是极点
landLeft 1
采用
而非
可能杆
。[我的重点]


使用
-:
landLeft
landRight
变体使用
Pole
作为返回类型,而不是
Maybe Pole
。让我们一次查看所有类型:

landLeft  1             ::       Pole -> Maybe Pole
landRight 4             ::       Pole -> Maybe Pole 
(-:)                    :: a -> (a    -> b         ) -> b
(0,0)                   :: Pole
(-:) (0,0)              ::      (Pole -> b         ) -> b
(-:) (0,0) (landLeft 1) ::                              Maybe Pole
由于
可能极
不是
,我们不能将
(:)
再次用于
土地权
。LYAH展示了如何处理这些函数:您需要一种方法将
a->Maybe b
函数与
Maybe a
一起使用。这就是
(>>=)
工作:

landLeft 1 (0,0) >>= landRight 4
继续本章,因为作者立即解决了您的问题:

当我们在没有使皮埃尔失去平衡的情况下降落鸟类时,我们得到了一根新的杆子,它被一个
包裹起来,只是
。但是当更多的鸟停在杆子的一侧时,我们得到的是一个
。这很酷,但是我们似乎已经失去了将鸟类反复降落在杆子上的能力。我们不能再做
landleft1(landRight 1(0,0))
,因为当我们将
landRight 1
应用于
(0,0)
时,我们不会得到
极点,但
可能是极点
landLeft 1
采用
而非
可能杆
。[我的重点]


可能极
不是
。你不能把一个
传递给需要
的东西。LYAH很快就要讨论这个问题了。谢谢@AJFarmar-这很有帮助。你能把它扩展到如何解决这个问题吗?LYAH会告诉你怎么做,但是你可以写
a:-f=a>>=f
,只写
而不是
(0,0)
。但是,李亚很快会再次解释这一点。
也许Pole
不是
Pole
。你不能把一个
传递给需要
的东西。LYAH很快就要讨论这个问题了。谢谢@AJFarmar-这很有帮助。你能把它扩展到如何解决这个问题吗?LYAH会告诉你怎么做,但是你可以写
a:-f=a>>=f
,只写
而不是
(0,0)
。但再一次,LYAH将很快解释这一点。谢谢@Zeta,这很有帮助。你是说书上说错误代码给出了一个有效的值——书中有一个打字错误吗?@hawkeye我是说这一章必须按顺序完整地阅读。如果只读取代码片段,可能会导致代码中断。有两种类型的
landLeft
,一种使用
Maybe
,因此不适用于
(:)
,另一种不使用
Maybe
,因此适用于
(:)
。不幸的是,这两种变体的名称相同。谢谢@Zeta,这很有帮助。你是说书上说错误代码给出了一个有效的值——书中有一个打字错误吗?@hawkeye我是说这一章必须按顺序完整地阅读。如果只读取代码片段,可能会导致代码中断。有两种类型的
landLeft
,一种使用
Maybe
,因此不适用于
(:)
,另一种不使用
Maybe
,因此适用于
(:)
。不幸的是,这两种变体的名称相同。