Ошибки экземпляра в примере GenProg от Hackage

Итак, я пытаюсь получить пример работы GenProg, библиотеки генетического программирования Haskell.

Однако я получаю различные ошибки экземпляра. Я предполагаю, что пример написан на немного устаревшем языке Haskell, и его просто нужно немного подправить. Код имеет смысл, но я недостаточно знаю об экземплярах, чтобы легко переписать его самостоятельно. Я сделал несколько настроек.

Ошибка:

genprogtest.hs:27:10: Не удалось вывести (MonadRandom-0.1.13:Control.Monad.Random.Class.MonadRandom (Rand StdGen)) из суперклассов объявления экземпляра из контекста (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  

person zariuq    schedule 29.04.2015    source источник
comment
Похоже, у вас может быть установлена ​​конфликтующая версия пакета (это случилось со мной на днях). Попробуйте установить его в песочнице или, если вы уже установили, попробуйте удалить песочницу и начать с новой.   -  person bheklilr    schedule 29.04.2015
comment
Хм, моя версия клики, похоже, не поддерживает сандоксы (как я видел в учебнике). Поэтому я обновился до Haskell Platform 2014. Теперь кабалы жалуются на ошибки компиляции при попытке установить GenProg... Работает ли GenProg (или пример) для других? (Скажем, в версии 7.8.3, 7.10.1 или...)   -  person zariuq    schedule 30.04.2015
comment
Вау, я чувствую себя идиотом :( Добавление import GenProg.GenExpr import GenProg.GenExpr.Data Заработало :‹ (В версии 7.6.3 -- пакет, кажется, не компилируется в других версиях :/) В примере в версии GitHub: github.com/jsnajder/genprog/blob/master/src/GenProg.hs (что, тьфу, немного отличается от версии Hackage)   -  person zariuq    schedule 30.04.2015
comment
Для потомков я обнаружил, что просто import GenProg.GenExpr.Data было достаточно (но необходимо)   -  person declension    schedule 04.09.2017
comment
@zariuq, поскольку вы нашли ответ, вы добавляете его и принимаете, чтобы указать, что этот вопрос решен для будущих читателей?   -  person sclv    schedule 17.03.2018


Ответы (1)


Добавление импорта GenProg.GenExpr.Data заставило его работать. (В версии 7.6.3 пакет не компилируется в других версиях.) С примером в версии GitHub: github.com/jsnajder/genprog/blob/master/src/GenProg.hs (который, тьфу , немного отличается от версии Hackage)

[Спасибо, что заметили, что на вопрос ответили в комментариях.]

person zariuq    schedule 18.03.2018