Haskell 高阶函数类型
Haskell Higher order function Type
我正在学习haskell。
但我正在为 'Type' 苦苦挣扎。
- 例如,
f
函数的类型是
f g (x,y)= g x y
(a -> b -> c) -> (a, b) -> c
- 以下 Haskell 函数的类型 h
h f g x y = f (g x y) x
(a -> b -> c) -> (b -> d -> a) -> b -> d -> c
我如何理解如何猜测函数类型?
我将引导您完成第一个:希望这能给您足够的想法,您可以自己弄清楚第二个。
所以函数定义为:
f g (x,y)= g x y
f
是我们感兴趣的函数,我们可以从上面看到——实际上只是从左边看——它有两个参数:g
和元组(x,y)
。所以让我们使用一些类型变量:
- 我们将使用
a
作为 g
的类型
b
类型为 x
c
类型为 y
- 和
d
用于 f
在给定两个参数时输出的类型。
这给了我们
f :: a -> (b, c) -> d
进一步就是所有我们可以从=
左边得到的信息。我们可以通过查看右侧了解更多信息 - g x y
必须是 d
.
类型
表达式 g x y
本身告诉我们 g
是一个可以接受 2 个参数的函数。此外,我们已经为这些参数及其 return 值分配了类型(因为这与 f g (x,y)
输出的值相同,我们已经说过它的类型为 d
)。
全部写出来,我们发现g
的类型就是b -> c -> d
。将其替换为我们上面写下的 f
类型,我们得到:
f :: (b -> c -> d) -> (b, c) -> d
如果我们愿意,我们现在可以重命名类型变量,使其与您提供的签名相匹配 - 但希望您无需这样做就可以看到它们是相同的。
正如我所说,虽然稍微复杂一些,但第二个练习可以使用完全相同的逻辑来解决。
我正在学习haskell。 但我正在为 'Type' 苦苦挣扎。
- 例如,
f
函数的类型是
f g (x,y)= g x y
(a -> b -> c) -> (a, b) -> c
- 以下 Haskell 函数的类型 h
h f g x y = f (g x y) x
(a -> b -> c) -> (b -> d -> a) -> b -> d -> c
我如何理解如何猜测函数类型?
我将引导您完成第一个:希望这能给您足够的想法,您可以自己弄清楚第二个。
所以函数定义为:
f g (x,y)= g x y
f
是我们感兴趣的函数,我们可以从上面看到——实际上只是从左边看——它有两个参数:g
和元组(x,y)
。所以让我们使用一些类型变量:
- 我们将使用
a
作为g
的类型
b
类型为x
c
类型为y
- 和
d
用于f
在给定两个参数时输出的类型。
这给了我们
f :: a -> (b, c) -> d
进一步就是所有我们可以从=
左边得到的信息。我们可以通过查看右侧了解更多信息 - g x y
必须是 d
.
表达式 g x y
本身告诉我们 g
是一个可以接受 2 个参数的函数。此外,我们已经为这些参数及其 return 值分配了类型(因为这与 f g (x,y)
输出的值相同,我们已经说过它的类型为 d
)。
全部写出来,我们发现g
的类型就是b -> c -> d
。将其替换为我们上面写下的 f
类型,我们得到:
f :: (b -> c -> d) -> (b, c) -> d
如果我们愿意,我们现在可以重命名类型变量,使其与您提供的签名相匹配 - 但希望您无需这样做就可以看到它们是相同的。
正如我所说,虽然稍微复杂一些,但第二个练习可以使用完全相同的逻辑来解决。