方法不可见
我试图创建一个“类似代理”的对象,即给定两个索引(代理索引,备用索引)返回该备选的首选项。方法不可见
我的错误是:
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)
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
的第一个参数,但实际上给出RandomAgent
由score
。一个或其他功能将不得不解构(认为“解开”)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
是必需的。
谢谢,我试过这个,但我仍然收到错误。我已经更新了我的问题。你是否建议制作咖喱功能? – drozzy 2012-02-09 22:35:20
看我的编辑。你最近的错误并不是因为咖喱或缺乏咖喱。 – dave4420 2012-02-09 22:47:57
哇,谢谢 - 我想它会一起来的!我还必须更改类型构造函数以接受一个整数:'data RandomAgent = RandomAgent Integer'。但是,我将如何使用'分数'功能?这看起来并不奏效:'(RandomAgent 1).score 5' :-(直接调用分数,即'score(RandomAgent 1)5'种类破坏了创建'Agent'数据类型的全部目的。 – drozzy 2012-02-10 00:01:20
你确定你没有输错'scope'而不是'score'吗? – mipadi 2012-02-09 22:21:38
是的!在我的帖子中输入错字。谢谢。 – drozzy 2012-02-09 22:22:25
RandomAgent类未在您显示的代码中的任何位置定义。这是另一个错字或你的实际错误(试图实例化错误的类)? – sepp2k 2012-02-09 22:26:59