对不起,我无法想象这个问题有更好的标题,所以请提前阅读.想象一下,我们有一个封闭类型的族,它将每种类型映射到Maybe
除了maybes之外的相应类型:
type family Family x where
Family (Maybe x) = Maybe x
Family x = Maybe x
Run Code Online (Sandbox Code Playgroud)
我们甚至可以使用该类型族声明一个函数:
doMagic :: a -> Family a
doMagic = undefined
exampleA = doMagic $ Just ()
exampleB = doMagic $ ()
Run Code Online (Sandbox Code Playgroud)
在GHCi中使用它表明可以评估此函数应用程序的类型:
*Strange> :t exampleA
exampleA :: Maybe ()
*Strange> :t exampleB
exampleB :: Maybe ()
Run Code Online (Sandbox Code Playgroud)
问题是,是否有可能提供该doMagic
功能的任何实现除外undefined
?举个例子说我想把每个值都包装成一个Just
构造函数,除了Maybes应该保持原样,我怎么能这样做呢?我尝试使用类型类,但如果不使用封闭类型系列,则无法为doMagic函数编写可编译签名,有人可以帮助我吗?
对于我的小爱好项目,我需要在运行时从C++程序中发出机器代码.我有基地址0xDEADBEEF,想写这样的东西:
Assembler a((void*)0xDEADBEEF);
a.Emit() <<
Push(Reg::Eax) <<
Push(Reg::Ebx) <<
Jmp(0xFEFEFEFE);
Run Code Online (Sandbox Code Playgroud)
内联汇编程序不是我的选择,因为生成的机器代码取决于程序状态.
有人知道任何现有的库吗?如果不是,从头开发并使其成为开源是否是一个好主意?(我的意思是,如果它存在,有人会使用这个库吗?)
有没有人知道是否有一种简单的方法可以使Stack从我的GitHub存储库中使用特定的修补版本的Cabal库?我很高兴我如何使用其他软件包的分叉版本,只需将它们放入packages:
部分stack.yaml
,但这似乎不适用于Cabal.
我想要的是指定git存储库URL和修订版的一些方法,stack.yaml
并从该源构建Cabal库,而不是从Hackage或任何上游存储库构建.这可以吗?
我正在为我的 haskell 程序创建一个 eDSL,它允许定义一组指令来存储数据。这些指令可能会相互依赖结果,甚至被序列化为文件以进一步恢复。这是我想出的东西(相当冗长,但这是我可以提取的最少代码量来重现我的问题):
{-# LANGUAGE TypeFamilies, RankNTypes, ExistentialQuantification, FlexibleContexts #-}
module Untouchable where
import Control.Applicative
import Control.Monad.Writer
import System.Random
class ResultClass e where
type ResultMonad :: * -> *
statementAResult :: ResultMonad (e Int)
literalResult :: a -> ResultMonad (e a)
data Statement result = StatementA | StatementB (result Int)
data StatementWithResult result t = StatementWithResult (Statement result, result t)
data AnyStatementWithResult result = forall t. AnyStatementWithResult (StatementWithResult result t)
type Program result a = (ResultClass result, ResultMonad ~ …
Run Code Online (Sandbox Code Playgroud)