haskell - 使用最通用的 typeclass 函数类型

标签 haskell

我正在尝试在 Haskell 中编写一个简单的遗传算法。我认为第一步应该是为“遗传”的个体创建一个类型类,如下所示:

class Genetic a where
    fitness :: (Ord b) => a -> b

这对我来说似乎是合理的——我不一定想将适应度函数限制为 Float 之类的类型。或 Double ,并且从概念上讲,适应度函数应该做的就是提供个体的排序。

但是,当我为 String 实现此类型类时包装:

data DNA = DNA String
instance Genetic DNA where
    fitness (DNA s) = length s

我在 GHC 中看到以下错误:
Could not deduce (b ~ Int)
from the context (Ord b)
  bound by the type signature for fitness :: Ord b => DNA -> b

这不是我应该如何定义类型类函数吗?我是否必须将函数限制为特定的具体类型,或者为类型类构造函数提供另一个类型变量?

最佳答案

Luqui 解释了问题所在:fitness需要能够提供任何 Ord例如,调用者可能会要求,而您真正想要的是最适合该类型的特定对象。

这是 IMO 一个非常好的关联类型同义词应用程序:

{-# LANGUAGE TypeFamilies, FlexibleInstances, FlexibleContexts #-}

class (Ord (Fitness a)) => Genetic a where
  type Fitness a :: *
  fitness :: a -> Fitness a

data DNA = DNA String
instance Genetic DNA where
  type Fitness DNA = Int
  fitness (DNA s) = length s

关于haskell - 使用最通用的 typeclass 函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099077/

相关文章:

haskell - 模块化程序设计 - 将 Monad Transformer 组合到 Monad 不可知函数中

haskell - Yampa 中 react (感觉)功能的时差

haskell - 以组合方式将异构提升类型反射回值

haskell - 扩大 ocaml 中的类型

haskell - GHCI 断点问题

haskell - 在 GHCi 中获取评估时间

haskell - 如何使用 haskell 堆栈创建一个 nix 包

haskell - 通过高阶函数传递数据

haskell - 如何使用 Repa 或 Accelerate 处理无限序列?

Haskell FFI : How do you wrap C++ collections?