很高兴知道(至少在Safe Haskell中)来自签名是否某些东西执行IO操作,但IO包含许多不同的东西 - putStr数据库访问,删除和写入文件,IORefs等.
如果我在运行任意代码时使用类型签名作为安全措施,那么我可能会愿意接受一些IO操作 - putStr例如 - 等等 - 而不是其他操作.
有没有办法定义IO monad的受限版本,只有一部分正常的IO操作?如果是这样,一个例子(putStr例如)将非常受欢迎!
我有一个重写规则,如下所示:
{-# RULES
"modify/fusedModify" forall f g key book. modify key f (modify key g book) = fusedModify key f g book
#-}
Run Code Online (Sandbox Code Playgroud)
在以下功能中触发:
pb :: PersonB
pb = ...
fusionB' :: PersonB
fusionB' =
let l x = (modify #name ('c':) (modify #name ('a':) x))
in l pb
Run Code Online (Sandbox Code Playgroud)
但是,没有让(并且可能是抽象?)它不会触发:
fusionB :: PersonB
fusionB = modify #name ('c':) (modify #name ('a':) pb)
Run Code Online (Sandbox Code Playgroud)
如果它走向另一个方向 - 也就是说,如果让抽象版本没有引起解雇,但fusionB确实如此 - 我想我明白了.可能是在特定情况下,fusedModify具有正确的类型签名,但在一般(更多态)情况下,它没有.但为什么在这个世界上我看到了这个?
对于它的价值,定义fusedModify是在这里,文件与fusionB和 …
通常,Haskell库使得不可能的状态在类型中不具代表性.但我经常看到Int只使用非负数才有意义.为什么Word不在这些情况下使用?
自从我在Edward Kmett的旧类别附加包中看到自然变换的定义以来,我就一直有这个问题.
-- | A natural transformation between functors f and g.
type f :~> g = forall a. f a -> g a
Run Code Online (Sandbox Code Playgroud)
但现在阅读斯蒂芬·迪尔的博客文章adjunctions,我觉得这样的:
在我们的上下文中的自然变换将是与两个Haskell仿函数实例f和g相关联的多态函数,其具有类型签名(Functor f,Functor g)=> forall a.fa - > g a.可以使用以下类型同义词编写.
Run Code Online (Sandbox Code Playgroud)type Nat f g = forall a. f a -> g a
面对我的"我将继续无视这种"的态度,这是一记耳光.所以对于这个问题:为什么可以突然放弃仿函数约束?
让我们说:
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
import Control.Lens
data T a b = T { _foo :: a
, _bar :: a -> b
}
makeLenses ''T
Run Code Online (Sandbox Code Playgroud)
a出现在两个foo和bar,因此更新必须是"simulatenous",因为它是.没有镜头可以这样做:
eg1 :: T a (b -> c) -> b -> T (a, b) c
eg1 (T foo bar) b = T (foo, b) (uncurry bar)
Run Code Online (Sandbox Code Playgroud)
但是我怎么能用镜头呢?以下不适用于发生的检查:
eg :: T a (b -> c) -> b -> T (a, b) c
eg t b = …Run Code Online (Sandbox Code Playgroud) 我开始尝试NixOS部署。为此,我有一个定义了一些软件包的仓库,以及一个configuration.nix用于服务器的仓库。
看来我以后应该可以在本地测试此配置了(我也正在运行NixOS)。我想将全局 变量更改configuration.nix为指向部署服务器的部署是个坏主意configuration.nix(谁知道会破坏什么);但是是否有一种安全便捷的方法可以在本地“试用”服务器-即构建服务器并引导到服务器中,或者更好地将其作为单独的进程启动?
我当然可以看到docker是一种方式。也许没有别的了。但是我有这种模糊的感觉,尼克斯可能有能力独自做到这一点。
从可以从可执行文件中推导出密钥的意义上来说,使用加密私钥分发已编译的程序(比如 C,绝对不是 Java)是否安全?如果多个可执行文件的不同之处仅在于在源中使用了不同的私钥,该怎么办?
我记得之前读到过,防病毒软件可以识别二进制可执行文件中的可疑模式,并且从汇编中似乎可以推断出密钥。
haskell ×5
compilation ×1
cryptography ×1
deployment ×1
functor ×1
ghc ×1
haskell-lens ×1
io ×1
monads ×1
nix ×1
nixos ×1
security ×1