首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hackage GenProg示例中的实例错误

Hackage GenProg示例中的实例错误
EN

Stack Overflow用户
提问于 2015-04-29 08:54:48
回答 1查看 111关注 0票数 2

因此,我试图得到一个GenProg工作的例子,一个Haskell基因编程库。

但是,我得到了各种实例错误。我猜这个例子是用稍微过时的Haskell写的,只需要稍微修改一下。代码是有意义的,但我对实例的了解还不足以让我自己轻松地重写它。我做了一些调整。

错误:

(MonadRandom-0.1.13:Control.Monad.Random.Class.MonadRandom (Rand StdGen):无法从上下文实例声明的超类(GenExpr E)中推断出GenExpr(Rand StdGen)

即,实例的第一行。(实际示例如下:https://hackage.haskell.org/package/genprog-0.1/docs/GenProg.html#9 )

代码语言:javascript
复制
{-# LANGUAGE DeriveDataTypeable, FlexibleInstances, FlexibleContexts, MultiParamTypeClasses #-}
-- Just put them in one line, yo~

import GenProg
import GenProg.GenExpr
import Data.Generics
import Control.Monad
import Control.Monad.Random

data E = Plus E E
       | Minus E E
       | Times E E
       | Div E E
       | Const Int
       deriving (Typeable,Data,Eq,Show)

eval :: E -> Maybe Int
eval (Const c)     = Just c
eval (Plus e1 e2)  = liftM2 (+) (eval e1) (eval e2)
eval (Minus e1 e2) = liftM2 (-) (eval e1) (eval e2)
eval (Times e1 e2) = liftM2 (*) (eval e1) (eval e2)
eval (Div e1 e2) | ok        = liftM2 div x1 x2
                 | otherwise = Nothing
  where (x1,x2) = (eval e1,eval e2)
        ok = x2 /= Just 0 && liftM2 mod x1 x2 == Just 0

instance (GenExpr E) => GenProg (Rand StdGen) E where
  terminal    = Const `liftM` getRandomR (1,9)
  nonterminal = do
    r <- getRandomR (0,3)
    [liftM2 Plus terminal terminal,
     liftM2 Minus terminal terminal,
     liftM2 Times terminal terminal,
     liftM2 Div terminal terminal] !! r    

myFitness :: (GenProg.GenExpr.GenExpr E) => Int -> E -> Double
myFitness n e = error + size
  where error = realToFrac $ maybe maxBound (abs . (n-)) (eval e)
        size  = (realToFrac $ nodes e) / 100  
EN

回答 1

Stack Overflow用户

发布于 2018-03-18 06:31:54

添加导入GenProg.GenExpr.Data使其工作。(在7.6.3版中--这个包似乎没有在其他版本中编译。)使用github.com/jsnajder/genprog/blob/master/src/GenProg.hs版本中的示例: GitHub (它与Hackage版本略有不同)

感谢你注意到这个问题在评论中得到了答复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29938821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档