Haskell 为什么可以';ghci是否与此类型匹配?
我正在学习-看这一章: 在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
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
,因此适用于(:)
。不幸的是,这两种变体的名称相同。