gpt4 book ai didi

haskell - 函数可以在非空类型构造函数上参数化多态吗?

转载 作者:行者123 更新时间:2023-12-03 09:39:38 24 4
gpt4 key购买 nike

在 Haskell 中,在处理 ad hoc 多态性时,有很多高级类型多态性的例子,例如 Monad 和 Functor。但是,我想不出任何参数多态性的例子。

这可能吗,如果可以,我可以举一个有用的例子吗?

最佳答案

如果您仍然允许类型类约束,那么答案是肯定的!例如。我仍然会调用类似的东西

normalise :: (Foldable f, Functor f, Fractional n) => f n -> f n
normalise v = fmap (/sum v) V

参数多态性。但我想这不是你的想法。

另一件显然可能的事情是限制类型具有特定的形式 _ _ , 喜欢
hmap :: (f a -> f b) -> [f a] -> [f b]
hmap = map

这并不是很了不起,但它可能在某些应用程序中用作类型检查器的微妙提示。事实上,这是解决幻象论证问题的一种方法:而不是
class LengthyList l where minimumLength :: l a -> Int
instance LengthyList [] where minimumLength _ = 0
instance LengthyList NonEmpty where minimumLength _ = 1

你可以签名
  minimumLength :: p (l a) -> Int

又名
  minimumLength :: proxy (l a) -> Int

这样你还是传入了 l的类型信息,但保证实现不能在运行时尝试评估参数。

standard way然而,这样做是
  minimumLength :: Tagged (l a) Int

or
  minimumLength :: Proxy (l a) -> Int

不过,通常情况下,您无法使用 f a 做任何事情。这也不能用 fa 完成,因此基本上您可以将任何此类高阶参数函数的类型重写为一阶参数多态函数。

关于haskell - 函数可以在非空类型构造函数上参数化多态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37991424/

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