假设您正在Haskell中构建一个相当大的模拟.有许多不同类型的实体,其属性随着模拟的进行而更新.让我们说,为了举例,您的实体被称为猴子,大象,熊等.
维护这些实体状态的首选方法是什么?
我想到的第一个也是最明显的方法是:
mainLoop :: [Monkey] -> [Elephant] -> [Bear] -> String
mainLoop monkeys elephants bears =
let monkeys' = updateMonkeys monkeys
elephants' = updateElephants elephants
bears' = updateBears bears
in
if shouldExit monkeys elephants bears then "Done" else
mainLoop monkeys' elephants' bears'
Run Code Online (Sandbox Code Playgroud)
在mainLoop函数签名中明确提到的每种类型的实体已经很难看了.你可以想象,如果你有20种类型的实体,它会变得非常糟糕.(20对于复杂的模拟来说并非不合理.)所以我认为这是一种不可接受的方法.但它的优点在于它们的功能updateMonkeys非常明确:它们会获取Monkeys列表并返回一个新的.
那么接下来的想法是将所有内容都卷成一个包含所有状态的大数据结构,从而清理以下签名mainLoop:
mainLoop :: GameState -> String
mainLoop gs0 =
let gs1 = updateMonkeys gs0
gs2 = updateElephants gs1
gs3 = updateBears gs2
in
if shouldExit gs0 then "Done" else
mainLoop …Run Code Online (Sandbox Code Playgroud) 我有一个git repo,里面有一些非常大的二进制文件.我不再需要它们,我不关心是否能够检查早期提交的文件.因此,为了减少repo大小,我想从历史中删除二进制文件.
在网络搜索之后,我得出结论,我最好的(仅?)选项是使用git-filter-branch:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_1.zip big_2.zip etc.zip' HEAD
Run Code Online (Sandbox Code Playgroud)
到目前为止,这似乎是一个好方法吗?
假设答案是肯定的,我还有另外一个问题需要解决.该git的手册中有这样的警告:
警告!重写的历史将具有所有对象的不同对象名称,并且不会与原始分支会聚.您将无法在原始分支的顶部轻松推送和分发重写的分支.如果您不知道完整的含义,请不要使用此命令,并且无论如何都要避免使用它,如果简单的单个提交就足以解决您的问题.(有关重写已发布历史记录的详细信息,请参阅git-rebase(1)中的"从上游重新恢复"部分.)
我们的服务器上有一个远程仓库.每个开发人员都会推动并从中拉出.基于上面的警告(以及我对git-filter-branch工作原理的理解),我认为我不能git-filter-branch在本地副本上运行然后推送更改.
所以,我暂时计划完成以下步骤:
这听起来不错吗?这是最好的解决方案吗?
我正在考虑Haskell的软实时应用程序.我可能会使用演员,这是值得的.我想知道是否有人了解Haskell的当前实时状态.具体来说,GC暂停应用程序的问题.我已经广泛搜索过,而且我在2年多前发现了大量的讨论,但没有任何最新内容.以下是我发现的几个参考文献:
我读过的很多旧东西都表明情况(当时)被认为正在改善.有吗?
甚至2年多以前,也有一些评论表明可以调整Haskell应用程序以可靠地将GC暂停降低到一毫秒或两秒.这看起来真实吗?
按照目前的最佳做法,每种方法的作用是什么?
基于我对Bundler和RVM的有限理解,似乎他们 - 像Rubygems - 有自己的宝石安装位置.另外,对于每一个,都可以选择使用sudo或安装到主目录中的系统路径.然后有能力使用Bundler供应宝石(适用时,例如使用Rails).
所以在我看来现在至少有七个地方可以安装宝石:
那么,管理这一切的最佳方法是什么?我们是否使用所有这三个(Rubygems,Bundler,RVM)并告诉他们所有人将宝石安装到同一个地方?我们sudo一直在使用,有时候还是从不使用?我们是否应该在生产和开发机器上使用不同的策略?
在相关的说明中,围绕Rubygems的Bundler和RVM包装器,它们是它们的替代品,还是它们完全正交?
我有各种结构,都实现相同的特征.我想在某些条件下进行分支,在运行时决定实例化哪些结构.然后,无论我遵循哪个分支,我都想从该特征中调用方法.
这可能在Rust吗?我希望实现类似下面的内容(不编译):
trait Barks {
fn bark(&self);
}
struct Dog;
impl Barks for Dog {
fn bark(&self) {
println!("Yip.");
}
}
struct Wolf;
impl Barks for Wolf {
fn bark(&self) {
println!("WOOF!");
}
}
fn main() {
let animal: Barks;
if 1 == 2 {
animal = Dog;
} else {
animal = Wolf;
}
animal.bark();
}
Run Code Online (Sandbox Code Playgroud) 大多数monad解释使用monad包含值的示例.例如Maybe a,a类型变量是包装的.但我想知道从未包装任何东西的monad.
对于一个人为的例子,假设我有一个可以控制但没有传感器的真实机器人.也许我想像这样控制它:
robotMovementScript :: RobotMonad ()
robotMovementScript = do
moveLeft 10
moveForward 25
rotate 180
main :: IO ()
main =
liftIO $ runRobot robotMovementScript connectToRobot
Run Code Online (Sandbox Code Playgroud)
在我们想象中的API中,connectToRobot返回物理设备的某种句柄.这种联系成为了"背景" RobotMonad.因为我们与机器人的连接永远不会向我们发送价值,所以monad的具体类型总是如此RobotMonad ().
一些问题:
RobotMonad- 从未包含一个值?或者这与monads的基本概念相反?<>.虽然do符号似乎更具可读性.RobotMonad ()?我看过Data.Binary.Put一个例子.它似乎与我的想法相似(或者可能相同?).但它也涉及Writer monad和Builder monoid.考虑到那些增加的皱纹和我目前的技能水平,我认为Putmonad可能不是最有启发性的例子.
编辑
我实际上并不需要构建这样的机器人或API.这个例子完全是人为的.我只需要一个例子,那里永远不会有理由从monad中取出一个值.所以我不是要求解决机器人问题的最简单方法.相反,这种关于没有内在价值的单子的思想实验是试图更好地理解monad.
Less gem已被less.js取代,它使用Node.js在服务器上运行.更多,Rails的"官方"Less插件自2010年6月14日起未更新.
鉴于这一切,这些天使用Less with Rails的推荐方法是什么?我想我可以随时使用客户端JS,每个人似乎都在接受.但我并不是因为依赖客户端JS来改造样式表而疯狂,特别是考虑到我想要优雅地降级.我意识到Less.js被认为非常快,但作为一个原则问题,我不希望我的CSS完全依赖于浏览器的JS引擎.
假设我想编译Less服务器端,这些天用于Rails的最佳实践是什么?我知道你可以使用Node.js运行Less,但我正在寻找漂亮的Rails集成,就像我们曾经拥有的更多.
我正在寻找可以在Linux和Mac上运行的东西.理想情况下,它将是一个gem或Rails插件,而不是一个独立的应用程序.
更新:我正在研究是否可以使用Ruby Racer将Less.js嵌入到Rails应用程序中.有没有人对此有意见?
更新2:这个问题真的很老了,但是对于任何仍然感兴趣的人,我只想指出Rails 3开箱即用的SCSS集成.SCSS是一个很少的竞争者,我对它很满意.
我一直在使用glBufferData,我必须指定使用提示(例如GL_DYNAMIC_DRAW).
但是,最近我在Stack Overflow上向我建议使用glMapBuffer或glMapBufferRange修改非连续的顶点数据块.
使用时glMapBuffer,似乎没有任何指定用法提示的点.所以,我的问题如下:
glMapBuffer如果你从未打过glBufferData那个VBO,它是否适用于给定的VBO?glMapBuffervs 的优点/缺点是glBufferData什么?(我知道他们并没有做同样的事情.但似乎通过获取指针glMapBuffer然后写入该地址,你可以做同样的事情glBufferData.)假设我有一个像这样定义的Erlang actor:
counter(Num) ->
receive
{From, increment} ->
From ! {self(), new_value, Num + 1}
counter(Num + 1);
end.
Run Code Online (Sandbox Code Playgroud)
同样,我有一个像这样定义的Ruby类:
class Counter
def initialize(num)
@num = num
end
def increment
@num += 1
end
end
Run Code Online (Sandbox Code Playgroud)
Erlang代码以函数式编写,使用尾递归来维护状态.但是,这种差异的有意义影响是什么?对于我天真的眼睛来说,这两个东西的接口看起来大致相同:你发送一条消息,状态得到更新,然后你回来了一个新状态的表示.
函数式编程经常被描述为与OOP完全不同的范例.但是Erlang actor似乎完全按照对象应该做的:维护状态,封装并提供基于消息的接口.
换句话说,当我在Erlang actor之间传递消息时,它与我在Ruby对象之间传递消息的方式有何不同?
我怀疑功能/ OOP二分法的影响比我看到的要大.有谁可以指出他们?
让我们撇开这样一个事实,即Erlang actor将由VM调度,因此可以与其他代码同时运行.我意识到这是Erlang和Ruby版本之间的一个主要区别,但这不是我所得到的.在其他语言中可以实现并发,包括Ruby.虽然Erlang的并发性可能表现得非常不同(有时候会更好),但我并不是在询问性能差异.
相反,我对问题的功能与OOP方面更感兴趣.
我正在和我一起工作Control.Lens.我写的实际功能相当复杂,但为了这个问题的目的,我把它归结为一个最小的失败例子:
import Control.Lens
exampleFunc :: Lens s t a b -> String
exampleFunc _ = "Example"
Run Code Online (Sandbox Code Playgroud)
这无法编译,产生以下错误消息:
Illegal polymorphic or qualified type: Lens s t a b
Perhaps you intended to use -XRankNTypes or -XRank2Types
In the type signature for `exampleFunc':
exampleFunc :: Lens s t a b -> String
Run Code Online (Sandbox Code Playgroud)
为什么这是非法的?这似乎非常类似于以下,这确实编译:
import Data.Maybe
exampleFunc' :: Maybe (s, t, a, b) -> String
exampleFunc' _ = "Example"
Run Code Online (Sandbox Code Playgroud)
所以我假设差异在于定义Lens.但是这种Lens类型exampleFunc的类型是非法的呢?我有一种潜在的怀疑,它与Functor定义中的资格有关Lens …