gpt4 book ai didi

具有复合/多参数类型构造函数的 Haskell 类型签名

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

我发现了这些类型的签名:

x :: a b -> Int
x f = 3

y :: a b c -> Int
y f = 3

z :: a b c d -> Int
z f = 3

> x [1] -- 3
> y (1, 2) -- 3
> z (1, 2, 3) -- 3

基本上:
  • x 只接受包含 1 个或更多参数的类型构造函数的值。
  • y 只接受包含 2 个或更多参数的类型构造函数的值。
  • z 只接受包含 3 个或更多参数的类型构造函数的值。

  • 它们是有效的,但我不确定它们的含义或它们的用途。

    它们似乎与类型构造函数上的多型概念或多态有关,但是基于类型构造函数接受的许多参数强制执行不变量。

    最佳答案

    如果没有进一步的限制,这样的类型是无用的——你真的不能用它们做任何事情,期待直接传递它们。但这实际上与签名 a -> Int 的情况相同。 : 如果对 a 一无所知,你也无能为力!

    但是,就像与例如toInteger :: Integral a => a -> Integer ,向参数添加约束可以让你做一些事情。例如,

    import Data.Foldable
    import Prelude hiding (foldr)

    x' :: (Foldable a, Integral b) => a b -> Integer
    x' = foldr ((+) . toInteger) 0

    通常情况下,当你有一个表单类型 a b ... n o p q 时,然后 a b ... p至少是 Functor 的一个实例类(class),也经常 ApplicativeMonad ;有时 Foldable , Traversable , 或 Comonad ;有时 a b ... o将是 Arrow ...这些约束允许您对复合类型做很多事情,而无需知道您正在处理什么特定的类型构造函数。

    关于具有复合/多参数类型构造函数的 Haskell 类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29210315/

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