gpt4 book ai didi

haskell - 理解(,)<$>长度<*>头部的类型

转载 作者:行者123 更新时间:2023-12-04 14:44:14 27 4
gpt4 key购买 nike

我有这对功能

(,) <$> length :: Foldable t => t a -> b -> (Int, b)
和,
head :: [a] -> a
我想了解的类型
(,) <$> length <*> head
(<*>) :: Applicative f => f (a -> b) -> f a -> f b类型签名, f :: (->) [a] a :: b b :: (Int -> b)因此,实例化类型将是:
(->) [a] (Int, b)
但是,我发现它的类型确实是:
(->) [a] (Int, a)
两个问题,如果可以的话:
  • 为什么是b切换为 a ?
  • 这种类型签名计算的分步过程是什么?
  • 最佳答案

    让我们继续使用签名

    (,) <$> length :: Foldable t => t a -> b -> (Int, b)
    但改变
    (<*>) :: Applicative f => f (a -> b) -> f a -> f b

    (<*>) :: Applicative f => f (x -> y) -> f x -> f y
    所以它不会让人困惑。清楚 f ~ (->) [a] (假设我们正在使用 foldable 的列表实例)正如您所注意到的,因此 x -> y ~ b -> (Int, b) , 所以 x ~ by ~ (Int, b) .这是您错过的部分,可能是因为命名困惑:第二个参数是 f x[a] -> b ,然后您传入 head , 即 [a] -> a .此 部队 b变成和 a一样,否则类型将无法解决。结果是 f y , 或 [a] -> (Int, b) ,除了 b现在是 a , 给您 [a] -> (Int, a)签名。

    关于haskell - 理解(,)<$>长度<*>头部的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66026644/

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