gpt4 book ai didi

haskell - Haskell 中 (fmap.fmap) sum Just [1,2,3] 类型如何检查?

转载 作者:行者123 更新时间:2023-12-02 21:08:17 25 4
gpt4 key购买 nike

我不明白这个简单的表达式类型在 Haskell 中如何检查

(fmap.fmap) sum Just [1, 2, 3]

fmap 的组合类型为:

fmap.fmap
:: (Functor f1, Functor f) => (a -> b) -> f (f1 a) -> f (f1 b)

所以我期望 f1 ~ List 和 f ~ Maybe,这意味着函数的类型应该是 Integer -> b。但如果在 ghci 中对其进行类型检查,我会得到:

t (fmap.fmap) _ Just [1, 2, 3]

<interactive>:1:13: error:
• Found hole: _ :: [Integer] -> b
Where: ‘b’ is a rigid type variable bound by
the inferred type of it :: Maybe b at <interactive>:1:1
• In the first argument of ‘fmap . fmap’, namely ‘_’
In the expression: (fmap . fmap) _ Just [1, 2, 3]

我看到 ghci 推导出函数的类型为 [Integer] -> b。这怎么可能?

最佳答案

没有理由期待 f1 ~ []f ~ Maybe。请注意,您需要 Just::f (f1 a)。我们知道Just::a -> Maybe a。因此,实际上,f ~ (->) af1 ~ Maybe。那么你就有了

fmap . fmap :: (a -> b) -> (a -> Maybe a) -> a -> Maybe b
-- ^^sum^^^ ^^^^^Just^^^^^ ^ [1, 2, 3]

既然我们知道[1, 2, 3]::a,我们现在就可以推导出a ~ [Integer](默认为Num code>eric 类型转换为 Integer)。

fmap . fmap :: ([Integer] -> b) -> ([Integer] -> Maybe [Integer]) -> [Integer] -> Maybe b

关于haskell - Haskell 中 (fmap.fmap) sum Just [1,2,3] 类型如何检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61593098/

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