方法不可见

时间:2012-02-09 22:16:33

标签: haskell

我正在尝试创建一个“类似代理”的对象,给定两个索引(代理索引,替代索引)返回它对该替代方案的偏好。

我的错误是:

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 个答案:

答案 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作为其第一个参数,但实际上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