gpt4 book ai didi

haskell - 根据参数和请求的返回类型退回产品或记录的一部分的功能

转载 作者:行者123 更新时间:2023-12-03 22:06:10 25 4
gpt4 key购买 nike

我正在寻找一个函数,给定必要的返回类型,该函数将完全基于传递给函数的类型结构来返回与该类型匹配的产品参数部分。

例如:

data MyProduct = MyProduct String Int Bool

prod = MyProduct "yes" 0 False

func prod :: Boolean -- would return False
func prod :: String -- would return "yes"
func prod :: Double -- compiler error


同样,对于相同的功能 func,但产品不同:

data AnotherProduct = AP (Maybe Int) Char

ap = AP Nothing 'C'

func ap :: Maybe Int -- would return Nothing


是否存在这样的功能?我觉得应该可以,也许使用 Generic。我知道这在其他语言中也是可行的,例如带有Shapeless库的Scala,但是我无法确定在Haskell中如何最好地实现这一点。

最佳答案

以下是获取所有兼容字段的列表的方法:

import Data.Data
import Data.Typeable
import Data.Maybe (maybeToList)

fields :: (Data a, Typeable b) => a -> [b]
fields = gmapQr (++) [] (maybeToList . cast)


您使用的产品类型应派生 Data。这可以通过 {-# LANGUAGE DeriveDataTypeable #-}自动完成

data MyProduct = MyProduct String Int Bool
deriving (Typeable, Data)


请参阅 gmapQrcast的文档。

唯一需要注意的是,当您请求一个不存在的字段时,我想不出一种产生编译时错误的方法。我们需要某种 Data.Data的编译时版本。我不知道有任何这样的事情,尽管我怀疑这是可能的(尽管这可能会更痛苦-– deriving Data为我们做很多繁重的工作!)。

关于haskell - 根据参数和请求的返回类型退回产品或记录的一部分的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51736130/

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