gpt4 book ai didi

haskell - 为什么我只能在类型参数位置传递部分应用的类型构造函数?

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

这可能是一个愚蠢的问题,但我无法弄清楚以下行为的基本规则:

foo :: t (f a) -> f a b -- accepted
foo = undefined

bar :: t [f a] -> f a b -- rejected
bar = undefined
f 说得通适用于 aa b分别在 bar导致一种错误,因此被拒绝。但为什么是 foo公认?

最佳答案

就是那种f .
由于返回类型是 f a b - 即 f应用于两个参数,-表示f :: Type -> Type -> Type .
但随后 f a用作列表元素 - [f a] - 并且列表元素必须是 Type ,这意味着 f a :: Type ,这意味着 f :: Type -> Type .
不匹配。
foo之所以有效,是因为可以部分应用类型。也就是说,如果 f :: Type -> Type -> Type ,然后 f a :: Type -> Type .然后输入 t允许有类型参数 Type -> Type ,所以一切都匹配。

重申以上内容:

  • foo有效,因为类型 t可能有类型参数 Type -> Type .
  • bar不起作用,因为输入 [] (又名“列表”)必须有一个类型为 Type 的参数.
  • 关于haskell - 为什么我只能在类型参数位置传递部分应用的类型构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69108661/

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