在 Haskell 中创建一个具有 Int 或它们的数组的代数数据类型

Creating an algebraic data type in Haskell which has either an Int or an array of them

我需要的是一种数据类型,它要么包含一个精确值,要么包含一个可能候选者的列表。 (我将使用 Int 类型的值)。

我想要的是,如果我在具有精确值的 Cell 上执行 f: Int -> ... 函数,它是在该值上执行的,如果我执行 [=] 形式的函数14=] 在 Cell 上与 candidates 它在 candidates 数组上执行函数。因此我这样定义我的数据:

data Cell a = Exactly a | Candidates [a] deriving (Eq, Read, Show)

instance Functor Cell where  
    fmap f (Exactly x) = Exactly (f x)  
    fmap f (Candidates (x:xs)) = Candidates ( f (x:xs)) 

这不会编译并给我一个形式的错误

Occurs check: cannot construct the infinite type: b ~ [b] ...

如果我将代码编辑为

fmap f (Candidates (x:xs)) = Candidates ( map f (x:xs))

这确实可以编译,但不能很好地发挥我的作用,因为有时我必须处理整个数组而不是成员元素。

感谢您的帮助。

你的问题出在这一行

fmap f (Candidates (x:xs)) = Candidates ( f (x:xs))

函数 f 仅适用于单个值,而您正试图将其应用于列表。您需要做的是将 f 应用于列表中的每个元素。

尝试:

fmap f (Candidates xs) = Candidates ( fmap f xs)

这会将 f 应用于 xs 的每个成员。


顺便说一句,您是否阅读过 this article(或类似的)关于列表 monad 的内容?