gpt4 book ai didi

haskell - Hackage的GenProg示例中的实例错误

转载 作者:行者123 更新时间:2023-12-02 10:43:00 25 4
gpt4 key购买 nike

因此,我正在尝试获取GenProg工作的示例,这是Haskell基因编程库。

但是,我遇到各种实例错误。我的猜测是该示例是用稍稍过时的Haskell编写的,只需要稍作调整即可。该代码很有意义,但是我对实例了解不足,无法自己轻松重写它。我做了一些调整。

错误:

genprogtest.hs:27:10: Could not deduce (MonadRandom-0.1.13:Control.Monad.Random.Class.MonadRandom (Rand StdGen)) arising from the superclasses of an instance declaration from the context (GenExpr E)



也就是说,实例的第一行。
(实际示例在这里: https://hackage.haskell.org/package/genprog-0.1/docs/GenProg.html#9)
{-# 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

最佳答案

添加导入GenProg.GenExpr.Data使其起作用。 (在版本7.6.3中,该软件包似乎未在其他版本中进行编译。)使用GitHub版本中的示例:github.com/jsnajder/genprog/blob/master/src/GenProg.hs(其中,ugh ,与Hackage版本略有不同)

[感谢您已在评论中回答问题。]

关于haskell - Hackage的GenProg示例中的实例错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29938821/

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