gpt4 book ai didi

haskell - 访问自定义 Haskell 数据类型的函数

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

我已经搜索并搜索了以下内容,特别是在堆栈溢出和一般的 Google 中。如果它已经被涵盖或者太微不足道以至于没有在任何地方被提及,我深表歉意。

我为有时离散、有时连续的对象定义了自定义数据类型,如下所示:

data Gene =  Discrete String Int | Continuous String Double 
deriving (Eq, Show, Read, Ord)

这里,字符串代表基因的名称(例如 vWF 等),数字参数是其状态,可以是离散的也可以是连续的,如下所示:

bober = Discrete "vWF" 2
slick = Continuous "gurg" 0.45432

我可以使用记录语法来访问基因的属性,但是有两个不同的函数用于名称和状态。我想要的是一种访问身份的函数和一种访问状态的函数。对于身份,这很简单,因为这是两个值构造函数的字符串:

geneName :: Gene -> String
geneName (Discrete dName _) = dName
geneName (Continuous cName _) = cName

当我尝试创建一个返回基因状态的函数时,我遇到了麻烦。我认为模式匹配会起作用:

geneState :: Num a => Gene -> a
geneState (Discrete _ dState) = dState
geneState (Continuous _ cState) = cState

这无法在 GHCi 中加载,给出:

DynamicalModularity.hs:34:35: Couldn't match type Int' withDouble' Expected type: a Actual type: Double In the expression: cState In an equation for `geneState': geneState (Continuous _ cState) = cState Failed, modules loaded: none.

我尝试使用case语法:

geneState :: Num a => Gene -> a
geneState gene = case gene of (Discrete _ dState) -> dState
(Continuous _ cState) -> cState

同样无法加载:

DynamicalModularity.hs:30:56: Couldn't match type Int' withDouble' Expected type: a Actual type: Double In the expression: cState In a case alternative: (Continuous _ cState) -> cState In the expression: case gene of { (Discrete _ dState) -> dState (Continuous _ cState) -> cState } Failed, modules loaded: none.

我的问题是:我想做的事情是否可行和/或Haskell 好?我错过了一些明显的东西吗?一段时间以来我一直在寻找解决方案。任何帮助将不胜感激。

最佳答案

任何需要调用geneState结果的代码都需要能够处理IntDouble——显然这是因为我可以对离散值和连续值调用 geneState

让我们代表该代码中分别使用 IntDouble 的部分。这两个部分都必须是简单的函数,因此我们可以将它们写为

intConsumer    :: Int    -> result
doubleConsumer :: Double -> result

现在我让这两个部分返回相同的结果,因为使用代码必须始终返回相同类型的内容,无论它接收的是离散的还是连续的 Gene

现在,我们可以使用这些信息和模式匹配来编写geneState

geneState :: (Int -> result) -> (Double -> result) -> Gene -> result
geneState intConsumer doubleConsumer (Discrete _ st) = intConsumer st
geneState intConsumer doubleConsumer (Continuous _ st) = doubleConsumer st
<小时/>

我们可以简化此函数的一种方法是假设我们的所有消费者都单独在 Double 上运行 - 即使输入 Gene 是离散的。这在数学上是合理的,因为 Double 包含所有 Integers(如果您愿意,可以使其更正式)。

在 Haskell 中,函数 fromIntegralInt 转换为其他数字类型。我们可以这样写

geneStateAsDouble :: Gene -> Double
geneStateAsDouble = geneState fromIntegral id

关于haskell - 访问自定义 Haskell 数据类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24231999/

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