Type类积分有两个操作quot和div,但在哈斯克尔2010语种报告它没有规定他们应该做的事情.假设这div是不可分割的,有什么quot不同,或者目的是quot什么?你什么时候使用一个,而另一个?
可能是一个简单的,但我查看了文档并搜索了示例,我仍然不确定答案.
如果我有这样的列表:
[1,2,3,4,5,6,7,8,9,0]
Run Code Online (Sandbox Code Playgroud)
我想提取一个切片,比如从索引4到索引8,即我想要:
[5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)
在Haskell中这样做的惯用方法是什么?
既然JDK 7开发人员预览已经完成,人们可能会认为现在是新JLS的时候了.毕竟,语言已经发生了变化,虽然很小.
我还没找到任何东西.何时可以使用新的JLS,从哪里可以获得它?
Haskell 2010语言报告在第20.10.1.1节中指出:
deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
事实上,GHC库中的实现将允许
deleteBy :: (b -> a -> Bool) -> b -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
但实际上使用注释将类型限制为前者.
因此,人们不能说,例如:
foo = deleteBy fsteq 42 [(43, "foo"), (44, "bar"), (42, "baz")] where
fsteq a (b,_) = a == b
Run Code Online (Sandbox Code Playgroud)
因为Int不一样(Int, String).
这有什么好的理由吗?
我问的原因是,如果没有充分的理由,我会deleteBy在我正在做的Data.List 的Frege端口中包含更通用的类型.但也许我忽略了什么?
编辑:正如@hammar所指出的,这也适用于其他xxx By函数.
这听起来很傻,但我无法得到它.为什么表达式[] == []可以输入?更具体地说,哪种类型(在类Eq中)被推断为列表元素的类型?
在ghci会话中,我看到以下内容:
Prelude> :t (==[])
(==[]) :: (Eq [a]) => [a] -> Bool
Run Code Online (Sandbox Code Playgroud)
但约束也Eq [a]意味着Eq a,如下所示:
Prelude> (==[]) ([]::[IO ()])
<interactive>:1:1:
No instance for (Eq (IO ()))
arising from use of `==' at <interactive>:1:1-2
Probable fix: add an instance declaration for (Eq (IO ()))
In the definition of `it': it = (== []) ([] :: [IO ()])
Run Code Online (Sandbox Code Playgroud)
因此,在[] == []中,类型检查器必须假定列表元素是类Eq中的某种类型.但是哪一个?[]的类型只是[a],这肯定比Eq a => [a]更通用.
恕我直言这应该是暧昧的,至少在Haskell 98(这是我们所说的)
java中vararg可以使用的参数个数的最大值是多少?我相信应该有一些限制而且它不是无限的.
反射类和方法以及类加载器等需要所谓的"二进制"类名来使用.
问题是,如果一个人只有一个完全限定的名称,即一个人在源代码中使用的名称,那么如何获得二进制名称.
例如:
package frege;
public static class RT {
....
public static class X { .... }
}
Run Code Online (Sandbox Code Playgroud)
该类的完全限定名称将是frege.RT.X.然而,要获得类对象,需要编写:
Class.forName("frege.RT$X")
Run Code Online (Sandbox Code Playgroud)
并不是
Class.forName("frege.RT.X") // fails with ClassNotFoundException
Run Code Online (Sandbox Code Playgroud)
因为X碰巧是一个内在的阶级frege.RT.
一种可能的,但笨拙的,解决办法是更换.与$向后,一个接一个,直到Class.forName()不扔ClassNotFoundException了或者有没有更多的.替换.
有没有更好/众所周知/标准的解决方案?我看着在API文档Class,CLassLoader并java.lang.reflect但没有发现任何有用.
考虑着名的
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
假设,为了避免单态性限制,这用以下注释:
fibs :: Num a => [a]
Run Code Online (Sandbox Code Playgroud)
这似乎意味着在运行时,列表值fibs实际上并不存在,而是每次选择一个元素时重新计算列表的函数fibs?
问题是如何在您知道的不同Haskell实现中实际处理此类情况.
--- ADDED ----我觉得我必须详细说明一下.考虑:
fibsInteger :: [Integer]
fibsInteger = 0: 1: zipWith (+) fibsInteger (tail fibsInteger)
Run Code Online (Sandbox Code Playgroud)
并假设在程序执行期间的值
(fibsInteger !! 42)
Run Code Online (Sandbox Code Playgroud)
需要评估.在那种情况下,我希望像这样的后续评估会发现fibsInteger已经评估了前43个元素.这也意味着它fibsInteger本身及其前42个尾部已经在WHNF中.
然而,就fibs我所知,多态性是不可能的.FUZxxl的评论
因为类型类通常会引入一个包含具有该类型类功能的字典的新参数
似乎支持我的观点,即fibs有效的值在运行时有效地显示为函数?
如果是这样的话,那么像((maximum . map (fibs!!)) [100000 .. 101000] :: Integer)非多态变体那样的应用程序需要显着更长时间才能进行评估,((maximum . map (fibsInteger!!)) [100000 .. 101000] :: Integer)因为每次都必须重新计算前100000个数字.(不幸的是,我现在不能尝试这个)
我想知道以下两个swnippest在语义上是否相同,如果没有,有什么区别(我们假设我们想要计算类型R的结果,并且想要防止在执行过程中可能抛出的异常X所以):
public R tcf(....) {
try {
R some = ...;
... compute the result ....
return some;
}
catch (X exception) {
... exception handling ....
}
finally {
... clean up ....
}
}
Run Code Online (Sandbox Code Playgroud)
以下内容:
public R tc(....) {
try {
R some = ...;
... compute the result ....
return some;
}
catch (X exception) {
... exception handling ....
}
}
public R tf(....) {
try {
return tc(....); // wrap the try-catch in tc()
} …Run Code Online (Sandbox Code Playgroud) 我在haskell.org,haskell-prime wiki等上浏览了一段时间,但没有找到任何资源,如测试套件或其他一些资源,可以检查Haskell实现是否符合标准.
有人知道这些资源是否存在,并指出我在那里?
否则,我想知道如果有人声称他有一个符合Haskell-2010标准的实现,Haskell Prime Comitee会做什么?