关于遗传算法的书籍和教程解释说,使用格雷码在二进制基因组中编码整数通常比使用标准基数 2 更好。给出的原因是编码整数中 +1 或 -1 的变化,只需要一位翻转对于任何数字。换句话说,相邻整数在格雷码中也是相邻的,格雷编码中的优化问题至多具有与原始数值问题一样多的局部最优值。
与标准基数 2 相比,使用格雷码还有其他好处吗?
我注意到GHC ScopedTypeVariables能够在函数模式中绑定类型变量,但不能让模式.
作为一个最小的例子,考虑类型
data Foo where Foo :: Typeable a => a -> Foo
Run Code Online (Sandbox Code Playgroud)
如果我想访问Foo中的类型,则以下函数无法编译:
fooType :: Foo -> TypeRep
fooType (Foo x) =
let (_ :: a) = x
in typeRep (Proxy::Proxy a)
Run Code Online (Sandbox Code Playgroud)
但是使用这个技巧将类型变量绑定移动到函数调用,它可以正常工作:
fooType (Foo x) =
let helper (_ :: a) = typeRep (Proxy::Proxy a)
in helper x
Run Code Online (Sandbox Code Playgroud)
由于let绑定实际上是伪装的函数绑定,为什么上面两个代码片段不等同?
(在这个例子中,其他解决方案是创建TypeRepwith typeOf x,或者直接绑定变量,就像x :: a在顶级函数中一样.这些选项都不在我的实际代码中,并且使用它们不回答问题.)