我正在尝试创建一个“类似代理”的对象,给定两个索引(代理索引,替代索引)返回它对该替代方案的偏好。
我的错误是:
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)
答案 0 :(得分: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
作为其第一个参数,但实际上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
。