gpt4 book ai didi

haskell - 嗨::(b -> c) -> (a -> b) -> (a -> c) 在 Haskell

转载 作者:行者123 更新时间:2023-12-04 13:02:18 24 4
gpt4 key购买 nike

我在 Haskell 中有以下类型签名:

hi :: (b -> c) -> (a -> b) -> (a -> c)

我想写一个具体的实现,但我真的很难理解从哪里开始。我知道 hi 需要一个函数 (b -> c),它返回一个函数 (a ->b),它最终返回一个函数 (a -> c)。

谁能给我看一个具体实现的例子?我怎么知道从哪里开始这样的事情以及定义左侧的内容?

最佳答案

一种思考方式是作为一个函数,它接受 (b -> c)(a -> b)并返回另一个函数 (a -> c) .所以让我们从那个开始

hi f g = undefined       -- f :: b -> c, g :: a -> b

我们知道返回类型必须是函数 (a -> c) -
hi f g = \a -> undefined -- f :: b -> c, g :: a -> b

我们现在有 a 类型的东西在右边,我们有一个函数 g :: a -> b所以一个明智的做法(事实上,我们唯一能做的)就是申请 ga
hi f g = \a -> g a       -- ok, this fails to typecheck...

表达式 g a有类型 b , 和 f :: b -> c , 我们希望得到 c .再说一次,我们只能做一件事——
hi f g = \a -> f (g a)

这种类型的检查!我们现在开始清理过程。我们可以移动 a在等号的左边
hi f g a = f (g a)

而且,如果您碰巧知道组合运算符 .你会注意到它可以在这里使用
hi f g a = (f . g) a

现在 a两边都是多余的(这称为 eta reduction )
hi f g = f . g

我们可以拉 .使用其函数形式 (.) 将运算符放在表达式的前面
hi f g = (.) f g

现在 gf都是多余的(eta减少的另外两个应用)
hi = (.)

所以你的函数 hi无非就是函数组合。

关于haskell - 嗨::(b -> c) -> (a -> b) -> (a -> c) 在 Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22449870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com