gpt4 book ai didi

haskell - 当异构列表的所有元素都是同一类的实例时,如何将函数应用于它们?

转载 作者:行者123 更新时间:2023-12-03 23:08:21 26 4
gpt4 key购买 nike

Prelude> import Data.HList
Prelude Data.HList> let myList = False .*. 'c' .*. HNil
Prelude Data.HList> myList
H[False,'c']
Prelude Data.HList> :t myList
myList :: HList '[Bool, Char]

现在,

Prelude Data.HList> hMap show myList

<interactive>:5:1: error:
* Couldn't match type `Bool' with `Char'
arising from a use of `hMap'
* In the expression: hMap show myList
In an equation for `it': it = hMap show myList

我希望 H["False","'c'"] 类型为 H[String,String]

我知道 show 函数确实不是类型 Bool 和类型 Char 的同一个实例,但如果这样的操作是不可能的,我不明白这个 HList 的意义。

如何对那些类型共享实例的实例的功能部分进行通用操作?

最佳答案

正如其他人在评论中所说,HList 的替代品可能更易于使用。

无论如何,我认为你应该写:

hMap HShow myList

HList 包的工作方式,HList 上的所有操作都被提升到类型类级别,而高阶函数如 hMaphFoldr 不适用于“普通”辅助函数,但也需要将它们提升到类型类级别。

这里,HShow 是使用代理数据类型和 ApplyAB 类的实例定义的:

data HShow = HShow
instance (String ~ string, Show a) => ApplyAB HShow a string where
applyAB _ x = show x

如果你有自己的函数:

add5 :: (Num a) => a -> a
add5 = (+5)

你需要为它定义一个相似的数据类型和实例:

data HAdd5 = HAdd5
instance (Num a, a ~ b) => ApplyAB HAdd5 a b where
applyAB _ x = add5 x

然后:

> let myList = (10.1 :: Double) .*. (6 :: Int) .*. HNil
> print $ hMap HAdd5 myList
H[15.1,11]

编写这些实例可能有点棘手。如果以上实例以更自然的形式编写:

instance (Num a) => ApplyAB HAdd5 a a where
applyAB _ x = add5 x

那么类型推断就不会很好地工作。

关于HList的文档似乎不多,the official paper它看起来不像是一个很好的通用教程。也许this blog post会有帮助吗?

关于haskell - 当异构列表的所有元素都是同一类的实例时,如何将函数应用于它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60820087/

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