gpt4 book ai didi

haskell - 如何抽象一个常见的 Haskell 递归应用仿函数模式

转载 作者:行者123 更新时间:2023-12-04 08:59:06 26 4
gpt4 key购买 nike

在 Haskell 中使用 applicative functors 时,我经常遇到这样的重复代码:

instance Arbitrary MyType where
arbitrary = MyType <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary

在这个例子中,我想说:
instance Arbitrary MyType where
arbitrary = applyMany MyType 4 arbitrary

但我不知道如何制作 applyMany (或类似的东西)。我什至无法弄清楚类型是什么,但它需要一个数据构造函数、一个 Int (n) 和一个应用 n 次的函数。在为 QuickCheck、SmallCheck、Data.Binary、Xml 序列化和其他递归情况创建实例时会发生这种情况。

那么我该如何定义 applyMany ?

最佳答案

查看 derive .任何其他好的泛型库也应该能够做到这一点;派生只是我熟悉的一个。例如:

{-# LANGUAGE TemplateHaskell #-}
import Data.DeriveTH
import Test.QuickCheck

$( derive makeArbitrary ''MyType )

为了解决您实际提出的问题,FUZxxl 是对的,这在普通的 Vanilla Haskell 中是不可能的。正如您所指出的,甚至不清楚它的类型应该是什么。模板 Haskell 元编程是可能的(不太愉快)。如果你走这条路,你可能应该只使用一个已经为你完成了艰苦研究的泛型库。我相信使用类型级别的自然和类型类也是可能的,但不幸的是,这种类型级别的解决方案通常难以抽象。康纳·麦克布赖德是 working on that problem .

关于haskell - 如何抽象一个常见的 Haskell 递归应用仿函数模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755557/

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