我习惯于从Haskell那里进行懒惰的评估,并且发现自己因为我已经正确地使用了懒惰的评估而感到厌烦.这实际上是非常具有破坏性的,因为我使用的其他语言主要是懒得评估一些非常笨拙的东西,通常涉及自定义迭代器的推出等等.所以只是通过获取一定的了解,其实我已经自己做了少在我原来的语言生产力.叹.
但我听说AST宏提供了另一种干净的方式来做同样的事情.我经常听到诸如"懒惰评估使宏多余"的陈述,反之亦然,主要来自于对Lisp和Haskell社区的争吵.
我已经涉足各种Lisp变种中的宏.它们看起来像是一种非常有组织的复制和粘贴代码块的方式,可以在编译时处理.他们当然不是Lispers认为的圣杯.但这几乎可以肯定是因为我无法正确使用它们.当然,让宏系统在与语言本身组合在一起的相同核心数据结构上工作是非常有用的,但它仍然基本上是一种复制和粘贴代码的有组织方式.我承认,基于与允许完全运行时更改的语言相同的AST的宏系统是强大的.
我想知道的是,如何使用宏来简明扼要地进行懒惰评估呢?如果我想逐行处理文件而不会搞砸整个事情,我只返回一个列表,其中有一个映射到它的行读取例程.这是DWIM的完美例子(尽我所能).我甚至不必考虑它.
我显然没有得到宏.我已经使用过它们并且在炒作时并没有特别留下深刻的印象.因此,我缺少一些我没有通过在线阅读文档获得的东西.有人可以向我解释这一切吗?
在Haskell中,base库和Hackage包提供了几种将二进制IEEE-754浮点数据转换为提升Float和Double类型的方法.但是,这些方法的准确性,性能和可移植性尚不清楚.
对于旨在(跨)平台(反)序列化二进制格式的GHC目标库,处理IEEE-754浮点数据的最佳方法是什么?
这些是我在现有库和在线资源中遇到的方法.
这是data-binary-ieee754包使用的方法.因为Float,Double,Word32和Word64是的每个实例Storable中,一个能poke源类型的值到外部缓冲器,然后peek目标类型的一个值:
toFloat :: (F.Storable word, F.Storable float) => word -> float
toFloat word = F.unsafePerformIO $ F.alloca $ \buf -> do
F.poke (F.castPtr buf) word
F.peek buf
Run Code Online (Sandbox Code Playgroud)
在我的机器上这是有效的,但我畏缩看到分配只是为了完成强制.此外,虽然这个解决方案并不是唯一的,但这里隐含的假设是IEEE-754实际上是内存中的表示.包装附带的测试给它"在我的机器上工作"的批准印章,但这并不理想.
unsafeCoerce使用内存中IEEE-754表示的相同隐含假设,以下代码也可以获得"在我的机器上工作"的封条:
toFloat :: Word32 -> Float
toFloat = unsafeCoerce
Run Code Online (Sandbox Code Playgroud)
这样做的好处是不像上面的方法那样执行显式分配,但是文档说"你有责任确保旧的和新的类型具有相同的内部表示".这个隐含的假设仍然在做所有的工作,在处理提升的类型时更加费劲.
unsafeCoerce#扩展可能被视为"便携"的限制:
toFloat :: Word -> Float
toFloat (W# w) …Run Code Online (Sandbox Code Playgroud) 这个问题源于一个挑战布伦特Yorgey提出在OPLSS:写一个函数f :: (Int -> Int) -> Bool区分f undefined的f (\x -> undefined).我们所有的答案要么被使用,seq要么类似于令人厌恶的爆炸模式seq.例如:
f :: (Int -> Int) -> Bool
f g = g `seq` True
*Main> f undefined
*** Exception: Prelude.undefined
*Main> f (\x -> undefined)
True
Run Code Online (Sandbox Code Playgroud)
该GHC评上seq说,
e1 `seq` e2
Run Code Online (Sandbox Code Playgroud)
过去常见的
case e1 of { _ -> e2 }
Run Code Online (Sandbox Code Playgroud)
所以我尝试了手工制作.它不起作用:
f' g = case g of { _ -> True }
*Main> f' undefined
True
*Main> …Run Code Online (Sandbox Code Playgroud) 我有一个cabal包,可以导出一个NBT可能对其他开发人员有用的类型.我经历了Arbitrary为我的类型定义一个实例的麻烦,如果没有将它提供给其他开发人员来测试他们整合我的工作的代码,那将是一种耻辱.
但是,我想避免我的实例可能妨碍的情况.也许其他开发人员对实例应该是什么有不同的想法Arbitrary.也许我的软件包依赖于特定版本的QuickCheck可能会干扰或不需要客户端项目的依赖项.
我的想法没有特别的顺序,是:
Arbitrary实例保留在类型定义旁边,让客户端处理实例的阴影或覆盖QuickCheck版本号.Arbitrary实例在同一封装内的单独的模块孤儿例如,假设Data.NBT.Arbitrary.QuickCheck对整个包的依赖性仍然存在.Arbitrary在完全独立的包中提供实例,以便可以将其列为客户端项目的单独测试依赖项.Arbitrary在主包中包含实例和QuickCheck依赖项,但仅在-ftest设置了类似标志的情况下.我已经看到所有这些在其他库中使用的组合,但没有找到任何最佳工作的共识.我想在上传到Hackage之前尝试正确使用它.
我想有一些像bash的2>&1哈斯克尔结合重定向stdout并stderr从过程到一个单一的Handle.使用System.Process.createProcess或类似的库函数直接执行此操作会很好,特别是如果它使用与来自句柄的bash重定向wrt交错输入相同的语义.
createProcess最初提供的灵活性似乎很有希望:可以指定Handle用于标准文件描述符的a,因此Handle可以同时给出stdout和stderr.但是,Handle参数必须在调用之前已经存在.如果没有能力Handle在调用函数之前创建一个稀薄的空气,我不确定问题是否可以通过这种方式解决.
编辑:无论平台如何,解决方案都需要工作.
我无法将我的Android应用程序启动到三星Galaxy S2上.我正在尝试使用Google Add on Library for USB Accessory.当我在Google Nexsus S上启动相同的应用程序时,它运行正常.
在应用程序清单文件中,我使用了以下标记(在应用程序标记下):
<uses-library android:name="com.android.future.usb.accessory"/>
Run Code Online (Sandbox Code Playgroud)
我在控制台上得到的错误是
[2011-08-11 12:00:28 - App] Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
[2011-08-11 12:00:28 - App] Please check logcat output for more details.
[2011-08-11 12:00:29 - App] Launch canceled!
Run Code Online (Sandbox Code Playgroud)
现在,如果我从清单中省略以下行:
<uses-library android:name="com.android.future.usb.accessory"/>
Run Code Online (Sandbox Code Playgroud)
我在LogCat上收到以下错误:
08-11 11:58:40.250: ERROR/AndroidRuntime(30780): java.lang.NoClassDefFoundError: com.android.future.usb.UsbManager
Run Code Online (Sandbox Code Playgroud)
任何想法来解决这个问题?
我的目标是在Galaxy S2上使用USB主机(或至少使用USB附件API).
是否有任何对HUnit或QuickCheck的扩展,允许像Bamboo这样的持续集成系统对测试结果进行详细报告?
到目前为止,我最好的想法是简单地将测试作为构建脚本的一部分进行触发,并依靠测试以非零退出代码进行失败.这对于在测试失败时获得注意力是有效的,但是将构建失败与测试失败混淆并且需要涉及通过控制台输出来确定问题的来源.
如果这是使用当前工具的最佳选择,我的想法是为HUnit编写一个报告模块,它将以JUnit XML格式生成输出,然后将CI工具指向它,就像报告Java项目一样.尽管如此,这看起来有些过时,所以我很感激您对现有选项和新开发方向的看法.
我正在从矢量空间为OpenGL类型定义类的实例,并且为了节省我的打字肌肉,我想使用Template Haskell为我编写一堆实例.
我开始时通过定义函数来派生实例AdditiveGroup:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Data.VectorSpace.OpenGL.TH where
import Control.Applicative
import Control.Monad
import Data.AdditiveGroup
import Data.VectorSpace
import Language.Haskell.TH
deriveScalarAdditive ts = concat <$> forM (map conT ts) (\t -> [d|
instance AdditiveGroup $t where zeroV = 0; (^+^) = (+); negateV = negate
|])
Run Code Online (Sandbox Code Playgroud)
这很好,但请注意,我只是拼接$t到牛津支架一次.现在,派生VectorSpace实例的函数:
deriveScalarVectorSpace ts = concat <$> forM (map conT ts) (\t -> [d|
instance …Run Code Online (Sandbox Code Playgroud) 有没有一个很好的理由为什么库check中的Contol.Concurent.STM函数具有类型Bool -> STM a并且返回undefined成功而不是具有类型Bool -> STM ()?它实现的方式是类型检查器将polity编译一个do块结束,check foo只是在运行时失败*** Exception: Prelude.undefined.
关于哪个代码签名标识我应该在构建配置中使用哪个场景我都不清楚,如果有人能用最简单的方式解释它,我会很高兴.
这就是我所知道的:
我在Provisioning Portal中创建并在我的应用程序中实现开发配置文件和分发配置文件.

然后我根据不同的配置文件分配Project >> Build Settings >> Code Signing:

这是第一个问题:发布和发布有什么区别?哪一个应连接到Developer配置文件,哪一个应连接到Distribution配置文件?

我需要通过选择以下代码签名标识来定义构建配置,这有5个不同的步骤:

这是大问题...... 在哪种情况下我应该选择哪个代码签名标识?
我总是在同样的2台设备上运行应用程序:我的iPhone和iPad; 两者都在Provisioning Portal中定义并设置到配置文件中.我只想确保运行它可以在Simulator和Device上进行测试,然后再构建应用程序以便上传到App Store.
任何协助/指示将不胜感激.
haskell ×8
ghc ×2
quickcheck ×2
android ×1
cabal ×1
code-signing ×1
evaluation ×1
galaxy ×1
hunit ×1
ieee-754 ×1
io ×1
ios ×1
lisp ×1
macros ×1
scheme ×1
semantics ×1
stm ×1
subprocess ×1
testing ×1
usb ×1