我想Int
在Haskell中划分两个值并将结果作为a Float
.我尝试这样做:
foo :: Int -> Int -> Float
foo a b = fromRational $ a % b
Run Code Online (Sandbox Code Playgroud)
但是GHC(版本6.12.1)告诉我"无法将预期类型'Integer'与推断类型'Int'相匹配"关于a
表达式中的内容.
我理解为什么:fromRational
调用需要(%)
生成一个Ratio Integer
,所以操作数需要是类型Integer
而不是Int
.但是我正在划分的值远远没有接近Int
范围限制,因此使用任意精度的bignum类型似乎有点过分.
这样做的正确方法是什么?我应该只是打电话toInteger
给我的操作数,还是有一种(%)
我不了解的更好的方法(可能不涉及和比率)?
我有一个代数数据类型,其中一些构造函数具有可比较的值,而一些构造函数则没有.我写了一些像标准(==)
和(/=)
运算符一样工作的比较函数,但返回Nothing
没有意义的比较:
data Variant = IntValue Int
| FloatValue Float
| NoValue
equal :: Variant -> Variant -> Maybe Bool
equal (IntValue a) (IntValue b) = Just (a == b)
equal (FloatValue a) (FloatValue b) = Just (a == b)
equal _ _ = Nothing
unequal :: Variant -> Variant -> Maybe Bool
unequal (IntValue a) (IntValue b) = Just (a /= b)
unequal (FloatValue a) (FloatValue b) = Just (a /= b)
unequal _ …
Run Code Online (Sandbox Code Playgroud) 从各种OO语言的背景来到Haskell,对我来说似乎有点不利的一点是函数和字段名称没有限定与它们相关联的类型,所以如果碰撞就很容易碰到冲突.不同的数据类型具有相同名称的字段.
如果我有这三个模块:
module One where
data Foo a = Foo { value :: a }
----
module Two where
data Bar a = Bar { value :: a }
----
module Three where
import One
import Two
foo = Foo { value = 42 } -- compile error here
n = value foo -- and here
Run Code Online (Sandbox Code Playgroud)
对value
模块Three
内的非限定引用被认为是模糊的,即使在这种情况下只有两个导入名称中的一个有意义.(在OO语言中,引用foo.value
并且bar.value
将是明确的.)
当然,我可以通过写作消除歧义Foo { One.value = 42 }
,但这看起来很尴尬.我也可以用不同的方式命名字段,例如"fooValue"和"barValue",但冗余也Foo { fooValue = 42 }
看起来很尴尬. …
提供这个组合两个monad的例子的文档Control.Monad.Trans.Error
:
type ErrorWithIO e a = ErrorT e IO a
==> ErrorT (IO (Either e a))
Run Code Online (Sandbox Code Playgroud)
我觉得这是违反直觉的:即使ErrorT
是所谓包装 IO
,它看起来像该错误的信息已经注入到了IO操作的结果类型.我会期待它
==> ErrorT (Either e (IO a))
Run Code Online (Sandbox Code Playgroud)
基于"包装"一词的通常含义.
为了让事情更加混乱,StateT
每个人都有一些:
type MyError e = ErrorT e Identity -- (see footnote)
type StateWithError s e a = StateT s (MyError e) a
==> StateT (s -> ErrorT (Either e (a, s)))
Run Code Online (Sandbox Code Playgroud)
状态类型s
已被注入Either
的Right
侧,但整个Either
也被包裹在一个功能.
为了使事情变得更加混乱,如果单子相结合的其他方式:
type …
Run Code Online (Sandbox Code Playgroud) 我有一个C++ 11程序需要创建几个独立的随机生成器,供并行计算中的不同线程使用.应使用不同的种子值初始化这些生成器,以便它们都产生不同的伪随机序列.
我看到有一个std::seed_seq
类似乎是为了这个目的,但目前尚不清楚构建它的正确方法是什么.我见过的例子,比如cppreference.com上的例子,用一些在程序中硬编码的整数常量初始化它:
std::seed_seq seq{1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)
我怀疑这实际上是一个建议的最佳实践,所以我不知道什么是推荐的做法.特别是:
seed_seq
可以使用任意数量的整数进行初始化,因此初始化列表长度的重要性是什么?如果我想为100个随机生成器生成种子,我是否需要seed_seq
使用100个整数初始化?seed_seq
只用一个整数初始化a 然后用它来生成大量种子就可以吗?seed_seq
从单个整数构造一个然后从中生成大量种子是可以的,那么使用seed_seq
而不是普通的随机生成器有什么好处?为什么不直接std::mt19937
从该单个整数构造一个并使用它来为其他生成器生成种子值?我有一个看似泄漏的行为不当的应用程序.在简要的剖析器调查之后,大多数内存(80%)由java.lang.ref.Finalizer
实例保存.我怀疑终结器无法运行.
这种情况的常见原因似乎是终结者抛出的异常.但是,类的finalize
方法的javadoc Object
(例如,参见这里)似乎与自己相矛盾:它说明了
如果finalize方法抛出未捕获的异常,则忽略该异常并终止该对象的终止.
但后来,它也说明了这一点
finalize方法抛出的任何异常都会导致暂停此对象的终结,但会被忽略.
我应该相信什么(即终止或不结束?),您是否有任何关于如何调查此类明显泄漏的提示?
谢谢
我想从Eclipse打开任意文件.目前我这样做:
if (((File) selectedElement).isFile()) {
try {
Desktop.getDesktop().open((File) selectedElement);
} catch (IOException e) {
//TODO prompt for the appropriate application to open this file.
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这只有在操作系统具有与文件类型相关联的默认应用程序时才有效.这就是为什么,如果没有定义任何默认应用程序,我想问用户我应该使用哪个应用程序.但我不知道如何1)找到可用应用程序列表和2)打开该应用程序的文件.任何提示如何以独立于平台的方式实现它?
在java中,我可以轻松地描述带有aditional数据的枚举.
我可以形容这样的事情
public enum OperatorType
{
GreaterOrEqual (">=", "GreaterOrEqual"),
Greater (">" ,"Greater"),
Less ("<", "Less"),
LessOrEqual ("<=", "LessOrEqual"),
Equal ("==", "Equal"),
Between ("Between", "Between"),
Around ("Around","Around");
private final String symbol;
private final String name;
private OperatorType(final String symbol, final String name) {
this.symbol = symbol;
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
然后添加一个迭代values()的静态方法,将所有数据添加到hashmap中,并允许通过其中一个属性从映射中检索完整枚举数据作为键.
简而言之,enum是java中非常发达的类型.
现在,
转到c#,我的选择是什么?
我想要保存带有属性的枚举,将其加载到地图中,并在需要时按键进行检索.我有什么需要帮助的吗(比如每个枚举的单音 - 这不是一个好主意).
谢谢.
我有一个函数模板,该模板接受某种可调用类型的参数,并std::bind
用于为原始可调用对象创建一个带有预定义参数值的新可调用对象。我已经使用转发参考参数和编写了它std::forward
,如下所示:
template <typename F>
auto make_example_caller(F &&f) {
return std::bind(std::forward<F>(f), 123, 456, 789);
}
Run Code Online (Sandbox Code Playgroud)
的cppreference文档std::bind
说绑定的对象“持有std::decay<F>::type
从中构造的类型的成员对象std::forward<F>(f)
。由于std::bind
将函数转发到其内部数据成员,因此std::bind
用我自己的代码将同一函数转发到调用似乎是合理且适当的。
但是,尚不清楚带来什么好处。如果F
是引用类型,则std::decay
删除引用,因此绑定对象将存储其自己的可调用类型的实例。如果F
是右值引用,则该实例将被构造为move;如果是F
左值,则将其构造为副本;如果我编写如下函数,则可以得到相同的结果:
template <typename F>
auto make_example_caller(F f) { // Note, no &&
return std::bind(std::move(f), 123, 456, 789); // move, not forward
}
Run Code Online (Sandbox Code Playgroud)
现在,根据调用函数的f
方式,可以通过移动或复制来初始化函数自己的参数,但是无论哪种方式,我现在都有自己的函数对象实例,可以将其移入绑定对象。
后一种方法似乎更简单,但是我想知道是否遗漏了某些东西-尤其是因为相同的推理将适用于std::bind
它自身,但是它需要F&&
并转发它,而不是F
按值来获取并移动它。这样做有缺点吗?我看不到的东西?
我搜索并搜索了一个很好的答案,我即将因沮丧而哭泣.我是一个业余爱好者的程序员,我不做事,因为他们有意义,或者他们是正确的做法; 我这样做是为了学习,现在我很难过.
我想在屏幕上设置单个像素.这可能听起来很容易,但这是我的其他条件使其变得困难.我需要快速执行此操作,仅CPU,20 fps或更高(当然运行其他程序元素),400 x 300或更好的屏幕(全屏?).
我使用Python编写的使用Pygame的程序渲染了一些很酷的图像,但只用随机像素填充100px×100px的屏幕需要50毫秒(那是我的20 fps,而其他程序位则减慢了更多) .理想情况下,我很乐意制作我自己的(蹩脚)3D游戏,只使用CPU,设置屏幕上的像素(可能是体素八叉树的图形).
是否有任何方法(使用任何语言,但最好是Python)我想在RAM中制作一个像素值的二维数组(更像是带有RGB的3D数组)(这称为位图?)并将其转储到显示器上或者其他的东西?那会不会很快??? 你如何直接与窗口上的像素接口.哎呀!我很无能为力.我/我不是编程菜鸟.给我任何你可以扔给我的东西,我可以消化它.我只需要一些正确方向的指针(哈哈).