假设我有
data Foo a = Foo !Int a [a] | Bar [a]
Run Code Online (Sandbox Code Playgroud)
所以Foo构造函数的第一个参数是严格的,将被解压缩.进一步假设我正在传递Foo n给更高阶的函数f并且f没有内联(因此Foo n实际上已经传递).我得到的核心-O2表示n被盒装然后传递给Foo,结果传递给f.我的问题:我打电话会更好吗?
f (\a b -> Foo n a b)
Run Code Online (Sandbox Code Playgroud)
避免拳击n?或者会导致其他一些性能问题?
我其实是想要定义
foo' !n = \a b -> Foo n a b
Run Code Online (Sandbox Code Playgroud)
并打电话f (foo' n),我认为应该做同样的事情,但我想最好特别问一下.
我把这些定义放在一个文件中:
x = 'a' : 'b' : 'c' : []
y = ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)
(重要的是在文件中定义那些,而不是在GHCi中,因为在后一种情况下,事情变得更加奇怪,但这是另一个问题.)
现在,我在GHCi中加载此文件并:
?> :sprint x
x = _
?> :sprint y
y = _
?> seq x ()
()
?> seq y ()
()
?> :sprint x
x = 'a' : _
?> :sprint y
y = "abc"
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我理解在这种情况下会发生什么x,这正是我的预期.但那怎么样y?
我所看到的似乎与报告的第3.7节相矛盾,后者说:
翻译:以下标识成立:
Run Code Online (Sandbox Code Playgroud)[e1, …, ek] = e1 : (e2 : ( … (ek : [])))
此外:
y = [toUpper …Run Code Online (Sandbox Code Playgroud) Okasaki描述了可以使用该类型在Haskell中实现的持久实时队列
data Queue a = forall x . Queue
{ front :: [a]
, rear :: [a]
, schedule :: [x]
}
Run Code Online (Sandbox Code Playgroud)
增量旋转保持不变量
length schedule = length front - length rear
Run Code Online (Sandbox Code Playgroud)
如果您熟悉所涉及的队列,则可以跳过本节.
旋转功能看起来像
rotate :: [a] -> [a] -> [a] -> [a]
rotate [] (y : _) a = y : a
rotate (x : xs) (y : ys) a =
x : rotate xs ys (y : a)
Run Code Online (Sandbox Code Playgroud)
它由智能构造函数调用
exec :: [a] -> [a] -> [x] -> Queue …Run Code Online (Sandbox Code Playgroud) 这里有很多设置.如果你以前见过类型对齐的序列,你可以浏览所有内容.
类型对齐的序列是任何看起来模糊的东西
data ConsList c x y where
CNil :: ConsList c x x
Cons :: c x y -> ConsList c y z -> ConsList c x z
Run Code Online (Sandbox Code Playgroud)
给出了Atkey风格的索引函子和应用函子的类
class IxFunctor f where
ixmap :: (a -> b) -> f x y a -> f x y b
class IxFunctor f => IxApply f where
ixap :: f i j (a -> b) -> f j k a -> f i k b
class IxApply f => IxApplicative f …Run Code Online (Sandbox Code Playgroud) 如何检查OS X cocoa应用程序中的Internet连接?可以将Apple的iOS Reachability示例代码重用于此目的吗?
谢谢,
纳瓦
我知道分号在REPL中用作终结符.但我很困惑何时在源文件中使用它们.
例如,之后没有必要val x = 1.但如果我之后省略它use "foo.sml",编译器会抱怨它.
那么,使用分号的规则是什么?
我一直在尝试(并且失败)为我的Windows XP虚拟机设置任何类型的互联网连接,并希望得到一些帮助.
详情如下:
Virtualbox 4.3.0
Mac OS 10.6.8主机
Windows XP SP 2来宾
我的互联网连接是通过机场,主机的IP地址是192.168.1.2(由路由器动态分配)和路由器192.168.1.1.
我认为我遇到的问题是要么不知道我应该改变哪些设置或者我需要什么配置.Windows XP是否应该从Virtualbox中的内置DHCP服务器检索其设置,还是需要手动指定IP地址和网关?如果是这样,我怎么知道我应该使用哪些地址?
在Virtualbox偏好设置中,我还尝试添加仅主机网络并打开DHCP服务器,但是当我ping默认配置中使用的任何IP地址时,我只得到"请求超时"或"目标无法访问"消息.
作为最后的手段,我尝试安装guest添加项,但这使Windows甚至无法启动,因此这似乎也不是一个选项.
考虑到所有这些要点并尽量不使事情复杂化,我想我会从头开始重新开始,最简单的选择似乎就是建立一个桥接适配器连接,然后(在Windows XP中)手动指定相同的IP已分配主机的地址.但这也不起作用 - 客户端无法ping通路由器,并且在Finder警报出现后说网络上的另一台计算机已经使用相同的IP地址后,主机自动分配了不同的IP地址.
谢谢你的帮助!
这个问题实际上是一个非常密切相关问题的小格子; 我认为将它分解为止并不是很有意义.
创建a的基本方法之一Vector就是使用unsafeFreeze.顾名思义,unsafeFreeze真的是不安全的.特别是,没有什么能阻止MVector传递的内容unsafeFreeze在被冻结后被修改.这导致了两个不同的问题:
它可以使"不可变"向量的值发生变化.这只是Haskell一般避开的那种怪异动作.
修改冻结的矢量可以(至少可能)混淆垃圾收集器.没有文件证明垃圾收集器将扫描冻结的阵列以确保其内容被撤离.更一般地说,绝对禁止变异载体变异,这样做的结果完全没有说明.
所述vector包[1]提供了两种高效,看似安全,用于创建不变矢量原语:create和createT:
create :: (forall s. ST s (MVector s a)) -> Vector a
createT :: Traversable t => (forall s. ST s (t (MVector s a))) -> t (Vector a)
Run Code Online (Sandbox Code Playgroud)
无视矢量融合业务,基本实现看起来像
create m = runST $ m >>= unsafeFreeze
createT m = runST $ m >>= traverse unsafeFreeze
Run Code Online (Sandbox Code Playgroud)
create非常安全.它运行给定的ST s动作,它必须创建一个新的MVector s(runST确保它不能使用现有的类型,并确保fixST …
严格的状态monad定义使用:
m >>= k = State $ \s ->
case runState m s of
(a, s') -> runState (k a) s'
Run Code Online (Sandbox Code Playgroud)
但这仍然会泄漏记忆,因为a并且没有s'得到评估.例如,我们可能有一个函数f将大对象作为输入并快速返回(a, s'),但只要a没有评估,输入f就不能被GC.
一个可能的解决方案是f返回seq a (a, s'),但如果我们使用类似的东西MonadRandom,这并不总是可能的,并且状态被封装起来f.是否有这样定义的版本:
m >>= k = State $ \s ->
case runState m s of
(!a, !s') -> runState (k a) s'
Run Code Online (Sandbox Code Playgroud)
这已存在于任何地方的图书馆吗?
似乎直觉上很明显,以下法律应该成立:
traverse f . fmap g = traverse (f . g)
Run Code Online (Sandbox Code Playgroud)
似乎直接适用的唯一Traversable法律是
fmap g = runIdentity . traverse (Identity . g)
Run Code Online (Sandbox Code Playgroud)
这改变了问题
traverse f . runIdentity . traverse (Identity . g)
Run Code Online (Sandbox Code Playgroud)
似乎具有适当形式的唯一法律适用于此是自然法则.然而,这是关于应用变换,我没有看到任何这些.
除非我遗漏了什么,否则唯一剩下的就是参数化证明,我还没有得到关于如何编写这些内容的线索.
haskell ×7
macos ×2
arrays ×1
cocoa ×1
connection ×1
gadt ×1
ghc ×1
ghci ×1
ml ×1
networking ×1
performance ×1
queue ×1
sml ×1
smlnj ×1
state-monad ×1
traversable ×1
traversal ×1
vector ×1
virtualbox ×1
windows-xp ×1