gpt4 book ai didi

haskell - 将作为参数传递的函数应用于 Haskell 中的不同类型

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

有没有办法将作为参数传递的函数应用于两种不同的类型?作为一个人为的例子,我可以创建一个 (Maybe Int, Maybe Bool)使用表达式 (Just 3, Just True) ,但是如果我尝试使用该函数使这种行为更通用

generic :: (a -> Maybe a) -> (Maybe Int, Maybe Bool)
generic f = (f 3, f True)

这样我就可以做 generic Just 之类的事情,编译器会报错,因为类型变量 a是恒定的。

其用例是将通用函数应用于树结构,其中每个节点都由类型参数化。

最佳答案

这可以使用 rank-2 多态性来实现,如下所示:

{-# LANGUAGE Rank2Types #-}
generic :: (forall a. a -> Maybe a) -> (Maybe Int, Maybe Bool)
generic f = (f 3, f True)

通常你需要一些类型类限制(不是因为 generic 的实现需要它,而是因为调用者不能传递适用于所有类型的参数),例如
genericNum :: (forall a. Num a => a -> a) -> (Int, Integer)
genericNum f = (f 3, f 9)

关于haskell - 将作为参数传递的函数应用于 Haskell 中的不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35215763/

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