2012-02-09 62 views
0

我试图创建一个“类似代理”的对象,即给定两个索引(代理索引,备用索引)返回该备选的首选项。方法不可见

我的错误是:

Couldn't match expected type `Integer' 
      with actual type `RandomAgent' 
In the first argument of `preference', namely `agentNum' 
In the expression: preference agentNum alternative 
In an equation for `score': 
    score agentNum alternative = preference agentNum alternative 

我想有是一段代码,基本上代表了一个数学函数如A_i(x_j)其中A_i是替代x_j代理的“分数”的功能。

我将不胜感激关于如何进行的任何提示。也许还有一个更简单的方法...

全部下面代码的其它功能

module AgentGenerator where 

import System.Random 

type Alternative = Integer 


data RandomAgent = RandomAgent 

class Agent a where 
    score :: a -> Alternative -> Double 

instance Agent RandomAgent where 
    score agentNum alternative = preference agentNum alternative 

-- TODO: Replace Doubles with Agents 
-- Generate `n` agents with `x` alternatives each 
generate :: Integer -> Integer -> [Double] 
generate agents alternatives = [ preference i j | i <- [0..(agents-1)], j <- [0..(alternatives-1)] ] 

-- Given agent's index and alternative's index return that agent's 
-- preference for that alternative 
preference :: Integer -> Integer -> Double 
preference agent alternative = randomFromSeed $ fromCoord (agent, alternative) 

-- Given grid position convert it to a single integer 
fromCoord :: (Integer, Integer) -> Integer 
fromCoord (agent, alternative) = (agent * 10^0) + (alternative * 10^1) 

-- Generate random value between [0, 1] based on the seed 
randomFromSeed :: Integer -> Double 
randomFromSeed seed = value 
    where (value, gen) = randomR (0.0, 1.0) $ mkStdGen (fromIntegral seed) 
+1

你确定你没有输错'scope'而不是'score'吗? – mipadi 2012-02-09 22:21:38

+0

是的!在我的帖子中输入错字。谢谢。 – drozzy 2012-02-09 22:22:25

+3

RandomAgent类未在您显示的代码中的任何位置定义。这是另一个错字或你的实际错误(试图实例化错误的类)? – sepp2k 2012-02-09 22:26:59

回答

2
class Agent a where ... 

你定义一个名为Agent类签名......

instance RandomAgent Integer where ... 

...那么你声明Integer实现了RandomAgent类。

你的意思是宣布一个叫做RandomAgent的类型,其中包含一个Integer字段,并且实现了Agent类?你这样做,在两个步骤:

data RandomAgent = RandomAgent Integer -- first declare your RandomAgent type 

instance Agent RandomAgent where   -- then declare that it implements your Agent class 
    score agent alternative = preference agent alternative 

(正如你仍然在OOP的角度思考,我不得不指出的是,你可能不需要一个类(如果你只有一个类型的实现类,你肯定没有)......但如果这样做,这是你如何做到这一点)


回答第二个:

preference功能期待一个Integer的第一个参数,但实际上给出RandomAgentscore。一个或其他功能将不得不解构(认为“解开”)RandomAgent并提取Integer内的字段。

你可以做你的score功能是这样的:

instance Agent RandomAgent where 
    score (RandomAgent agentNum) alternative = preference agentNum alternative 

,或者您可能做到这一点在你的preference功能是这样的:

preference :: RandomAgent -> Integer -> Double 
preference (RandomAgent agent) alternative = randomFromSeed $ fromCoord (agent, alternative) 

显然,不要在变化这两个功能,否则你会发现自己通过Integer,其中RandomAgent是必需的。

+0

谢谢,我试过这个,但我仍然收到错误。我已经更新了我的问题。你是否建议制作咖喱功能? – drozzy 2012-02-09 22:35:20

+0

看我的编辑。你最近的错误并不是因为咖喱或缺乏咖喱。 – dave4420 2012-02-09 22:47:57

+0

哇,谢谢 - 我想它会一起来的!我还必须更改类型构造函数以接受一个整数:'data RandomAgent = RandomAgent Integer'。但是,我将如何使用'分数'功能?这看起来并不奏效:'(RandomAgent 1).score 5' :-(直接调用分数,即'score(RandomAgent 1)5'种类破坏了创建'Agent'数据类型的全部目的。 – drozzy 2012-02-10 00:01:20