gpt4 book ai didi

haskell - 高阶函数和 id

转载 作者:行者123 更新时间:2023-12-02 09:13:36 26 4
gpt4 key购买 nike

我似乎无法理解id如何用作某些高阶函数的参数。我在某处读到它用于“不去管某事”,但似乎无法理解它。

例如,为什么liftA2 id的类型是f (b -> c) -> f b -> f c

另外,为什么我不能将 id 传递给 g

g :: (Int -> Int -> Int) -> Int -> Int -> Int

最佳答案

I've read somewhere that [id] is used to "leave something alone" but can't seem to get my head around it.

id用于“不去管某事”,因为这就是它所做的一切——也就是说,什么也不做:

id :: x -> x
id x = x

既然如此,id通常显示为传递给高阶函数的不执行任何操作的占位符。 fmap id foo实际上并没有改变 foo 中找到的值(事实上​​, fmap id = id ,这是第一个仿函数定律), id . ff . id都相当于 f ,等等。一个更有趣的例子是the classic trick of defining foldl using foldr ,其中id用作使用 foldr 构建函数的基本情况.

For example, why is the type of liftA2 id f (b -> c) -> f b -> f c?

liftA2的类型是:

liftA2 :: (a -> b -> c) -> f a -> f b -> f c

liftA2 id为例,我们有...

(a -> (b -> c)) ~ (x -> x)

...所以...

a ~ x
(b -> c) ~ x

...因此...

liftA2 id :: f (b -> c) -> f b -> f c

(您可能知道, liftA2 id = (<*>) 。如果您将其写为 liftA2 ($)($) :: (a -> b) -> (a -> b) 只是一个专门的 id ,那么发生的事情可能会更明显。)

Also, why can't I pass id to g for

g :: (Int -> Int -> Int) -> Int -> Int -> Int

因为那样你就必须统一......

(Int -> (Int -> Int)) ~ (x -> x)

...这是不可能的,如 x不能同时 IntInt -> Int .

关于haskell - 高阶函数和 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49277802/

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