来自OOP我最近几周开始阅读函数式编程,并开始学习Haskell。我经常读到,(纯粹的)函数更容易测试,因为没有复杂的设置和拆卸例程。这听起来很合理,我同意了。通过编写这些函数,我可以通过一个经过良好测试的“基础”构建更复杂的函数。将数据类型传递给函数vs oop方法调用
当我盯着写我的第一个程序的一些功能得到了越来越多的参数,所以我开始创造出对我来说是类似结构的新的数据类型。当然,数据类型捆绑了逻辑上属于什么,有时由其他数据类型组成。然后
调用的功能,如
MyTpye = foo(MyTpye, someParam)
感觉有点像在结构与函数指针实现面向对象编程与真难看的语法早在C的时代:
MyType = foo(this, someParam) = {
...
return modified_copy_of_this;
}
测试这些功能也要求我首先设置我的新数据类型,这可能很复杂,我只是觉得我赢不了太多。
我想我还是太狭隘,专注于编写代码的OOP方式。我只是觉得在数据类型上调用函数只是调用不可变对象上的方法(当然,每个设置器都必须返回对象的修改版本)。
有人可以为我澄清这一点点吗?
非常感谢!
我加了这个Haskell的例子。这些是我的第一步,我试图发布这样丑陋的代码。 这只是再形成阶段学习算法的第一部分。建立一个具有可用状态,行为和奖励功能的“环境”。
type Action = [Double]
type State = [Double]
data StateSet = StateSet [State] deriving (Show)
data ActionSet = ActionSet [Action] deriving (Show)
data Environment = Environment {
availableStates :: StateSet,
availableActions:: ActionSet,
currentState :: State,
rewardfnc :: State -> Action -> Double,
lastReward :: Double
}
rewardFunction :: State -> Action -> Double
rewardFunction s a = (-1)
doAction :: Environment -> Action -> Environment
doAction env a = Environment (availableStates env) (availableActions env) a (rewardfnc env) ((rewardfnc env) (currentState env) a)
getReward :: Environment -> Double
getReward env = (lastReward env)
states = StateSet [[i,j] | i <- [1..10], j <- [1..10]]
actions = ActionSet [[i,j] | i <- [1..10], j <- [1..10]]
initEnv = Environment states actions [0,0] rewardFunction 0.0
env = doAction initEnv [2,2]
reward = getReward(env)
你能否给一个更具体的例子(最好在Haskell中,因为这就是你想学的东西)?我发现这个例子没有任何问题(如果我将它读作伪代码)。也许你可以提供你的类型和测试用例的定义。 – Andre
@Andre谢谢我添加了一个例子 –
只是提示你的代码:而不是定义数据类型'StateSet'和'ActionSet',你可以使用Data.Set中的Set数据类型:https://hackage.haskell .org/package/containers-0.5.6.3/docs/Data-Set.html然后分别使用'Set State'和'Set Action',然后你可以使用一大堆有效的函数来处理集合,而不需要额外的努力 – hdgarrood