gpt4 book ai didi

haskell - 如何避免编写这种类型的 Haskell 样板代码

转载 作者:行者123 更新时间:2023-12-03 01:49:39 26 4
gpt4 key购买 nike

我经常遇到这种情况,这很烦人。

假设我有一个 sum 类型,它可以保存 x 的实例或一堆与 x 无关的其他内容 -

data Foo x = X x | Y Int | Z String | ...(other constructors not involving x)

要声明一个 Functor 实例,我必须这样做 -

instance Functor Foo where
fmap f (X x) = X (f x)
fmap _ (Y y) = Y y
fmap _ (Z z) = Z z
... And so on

而我想做的是 -

instance Functor Foo where
fmap f (X x) = X (f x)
fmap _ a = a

即我只关心 X 构造函数,所有其他构造函数都只是“传递”。但是,这当然不会编译,因为等式左侧的 a 与等式右侧的 a 是不同的类型。

有没有办法可以避免为其他构造函数编写这个样板?

最佳答案

对此有两个主要的简单解决方案。

首先,对于简单类型,只需使用必要的扩展派生(仿函数)即可。

另一个解决方案是定义另一种数据类型:

data Bar = S String | B Bool | I Int  -- "Inner" type
data Foo a = X a | Q Bar -- "Outer" type

instance Functor Foo where
fmap f (X a) = X (f a)
fmap _ (Q b) = Q b -- `b' requires no type change.

所以你可以多写一行来删除很多行。

它对于模式匹配来说并不完全理想,但它至少解决了这个问题。

关于haskell - 如何避免编写这种类型的 Haskell 样板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30859917/

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