我正在尝试使用CircleCI来构建一些Haskell项目.Circle /home/ubuntu/.cabal在每次构建后自动缓存目录,我认为这会加快构建速度,但它们似乎只需要很长时间 - 所有跳过的都是下载步骤.
我正在使用的构建指令是
cabal update
cabal install --only-dependencies --enable-tests
cabal configure --enable-tests
cabal build
cabal test
Run Code Online (Sandbox Code Playgroud)
我预计该install --only-dependencies步骤会看到缓存并运行得更快.
可能出了什么问题?
有Functor没有Applicatives的好例子?好的,我正在寻找Const Void不需要诉求的非平凡(不)的例子undefined.如果没有,是否有任何方法可以证明那里的空间无趣?
这类似于不是Functor/Functor/Applicative/Monad的好例子?,但那里没有完全解决.
作为一个后续问题,是否有任何有趣的例子Functor可能会Applicative因为太多的非规范Applicative实例有意义而没有实例?例如,"扩展Maybe"有点无聊
data MayB a = Jus a | Nothing1 | Nothing2 | Nothing3 | ...
instance Applicative MayB where
pure = Jus
Jus f <*> Jus x = Jus (f x)
Jus f <*> n = n
n <*> Jus x = n
n1 <*> n2 = methodOfResolvingNothingWhatsoever n1 n2
Run Code Online (Sandbox Code Playgroud)
是否存在实例变体Applicative更具实质性的示例?
在Emacs中,我非常习惯于M-q"智能地重排和重新缩进文本的当前块或区域以匹配所需的宽度".它实际上是一个非常复杂的命令,很难跨越文档中的语言和语义区域.
但是,最简单且最常用的版本只是在注释块中包装行.
VSCode是否存在这样的命令?你如何使用它?你是如何配置的?
我正在为C中的库创建一个FFI模块,它希望在其他任何东西之前调用一次非重入函数.这个调用是幂等的,但是有状态的,所以我可以在每个Haskell调用中调用它.但它很慢并且由于不可重入而可能导致冲突.
那么这是使用unsafePerformIO的合适时机吗?我可以将Bool包装在一个不安全的IORef或MVar中,通过忽略后续调用(全局隐藏IORef状态为False的调用)使这些初始化调用成为幂等的.
如果没有,这样做的正确方法是什么?
对于我对这个问题的不良表达表示歉意,我不确定我是否有适当的词汇量.
我写了(最近)类似的东西
?let x = x in x? = ?
Run Code Online (Sandbox Code Playgroud)
但是我真的没有理解这里棘手的事情.我可以断言这句话是真的,? 因为我知道这是一个非生产性的无限循环.此外,我可以断言像
?let ones = 1:ones in ones? = ?(?x.(1,x)) = (1, (1, (1, ... )))
Run Code Online (Sandbox Code Playgroud)
但是什么进入了省略?据推测,它是无限数量的"一元组",如果你对AFA没问题,这是一个非常明确的数学对象,但我怎么能说服你,它不是一些有限数量的"一元组"然后是非生产性的??
显然,这涉及到解决停止问题,所以我不能一般.
那么在这种情况下,我们如何计算语义映射,就像它们是一个完整的函数一样?对于图灵不完整的语言,语义必然是不确定的吗?我想这意味着语义总是只是一种语言的近似,非正式的描述,但这个"洞"是否会更进一步?
我试图将attadarsec中的IResultmonad 解构为几块.这里的IResult
data IResult t r = Fail t [String] String
| Partial (t -> IResult t r)
| Done t r
Run Code Online (Sandbox Code Playgroud)
这感觉它应该是效果,"偏袒"和失败的组合.如果失败被表示为只是一个Either ([String], String)偏态可能
data Partiality t a = Now a | Later (t -> Partiality t a)
instance Monad (Partiality t) where
return = pure
(Now a) >>= f = f a
(Later go) >>= f = Later $ \t -> go t >>= f
class MonadPartial t m where
feed …Run Code Online (Sandbox Code Playgroud) 有什么缺点ScopedTypeVariables,如果有的话?为什么不默认开启?它会导致更糟糕的推断吗?是否存在失败的边缘情况?在GHC中实施起来要困难得多吗?
众所周知,Monad实例应该遵循Monad法则.可能不太为人所知,Functor实例应遵循Functor法则.尽管如此,我仍然对编写优化的GHC重写规则感到相当自信fmap id == id.
还有哪些标准类有隐含法则?是否(==)有一个真正的等价关系?是否Ord必须形成部分订单?总订单?我们至少可以假设它是可传递的吗?反对称?
这些最后几个似乎没有在Haskell 2010报告中指定,也不会有信心编写利用它们的重写规则.但是,有没有共同的图书馆?一个实例的病理如何可以自信地写出来?
最后,假设这样一个实例可能存在一个边界,那么每种类型实例必须遵守的法律是否有一个标准的综合资源?
举个例子,我要定义多少麻烦
newtype Doh = Doh Bool
instance Eq Doh where a == (Doh b) = b
Run Code Online (Sandbox Code Playgroud)
它只是难以理解或编译器在任何地方都不正确地优化?
假设我正在编写DSL并希望支持幻像类型支持和严重类型化表达式.我的价值类型可能是
{-# LANGUAGE GADTs, DataKinds #-}
data Ty = Num | Bool deriving (Typeable)
data Val a where
VNum :: Int -> Val Num
VBool :: Bool -> Val Bool
Run Code Online (Sandbox Code Playgroud)
我可以使用幻影删除版本
{-# LANGUAGE ExistentialQuantification #-}
data Valunk = forall a . Valunk (V' a)
Run Code Online (Sandbox Code Playgroud)
现在,我可以对值进行操作Valunk由case荷兰国际集团出既VNum和VBool,甚至以这种方式重新建立我的幻象类型
getNum :: Valunk -> Maybe (Val Num)
getNum (Valunk n@(VNum _)) = Just n
getNum _ = Nothing
Run Code Online (Sandbox Code Playgroud)
但这只是感觉我正在重新实现Typeable机器.不幸的是,GHC不会让我得出一个Typeable对Val
src/Types/Core.hs:97:13:
Can't make …Run Code Online (Sandbox Code Playgroud) 我想编写一个分析异构列表的函数.为了论证,我们有以下几点
data Rec rs where
Nil :: Rec '[]
Cons :: ty -> Rec rs -> Rec ( '(name, ty) ': rs )
class Analyze name ty where
analyze :: Proxy name -> ty -> Int
Run Code Online (Sandbox Code Playgroud)
最终目标是编写如下内容
class AnalyzeRec rs where
analyzeRec :: Rec rs -> [(String, Int)]
instance AnalyzeRec '[] where
analyzeRec Nil = []
instance (Analyze name ty, AnalyzeRec rs) =>
AnalyzeRec ( '(name, ty) ': rs )
where
analyzeRec (Cons hd tl) =
let proxy = Proxy …Run Code Online (Sandbox Code Playgroud)