我想有一个弹出的底部窗口,用于临时缓冲区,如编译,完成等.即使根窗口是水平分割,它也应该垂直分割整个帧.例如:在Mx编译之前:
+------+------+ | | | | | | | | | +------+------+
后:
+------+------+ | | | +------+------+ | | +------+------+
我对ecb-compilation-window非常满意,但我不想使用ECB和CEDET.实际上我看到了描述行为的两种方式,但两者都有其缺点.
缺点:它使用delete-other-windows函数,然后根据需要拆分根窗口后重建以前的Windows树.它使代码中存在的早期窗口(或任何模块的代码)的所有引用无效.
缺点:框架底部有恼人的模式线的小烦人窗口,不适用于emacs --daemon.
是否有更优雅的方法来做到这一点没有缺点?
假设我有一个框架的多态数据类型:
data Frame a = Frame {
fdata :: V.Vector (V.Vector a)
, frows :: Int
, fcols :: Int
}
makeFrame :: [[a]] -> Frame a
makeFrame s = ...
Run Code Online (Sandbox Code Playgroud)
我希望它的文本表示看起来像列表列表:
instance Show a => Show (Frame a) where
show (Frame m _ _) = show $ V.toList $ V.toList <$> m
instance Read a => Read (Frame a) where
readsPrec _ value = [makeFrame $ read value, "")]
Run Code Online (Sandbox Code Playgroud)
我对我的读取功能非常满意,直到我发现框架在元组内部时它不能正常工作:
-- works
> let x = read $ show …Run Code Online (Sandbox Code Playgroud) 通常我知道如何修复模糊的类型变量问题,但这次不知道.长话短说,我使用protobuf Haskell库来处理协议缓冲区.该库让您忘记维护单独的.proto文件,如果它分别是Encode和Decode类型的实例,它会导致序列化和反序列化您的数据类型.
我正在protobuf之上设计一个简单的协议.主消息数据类型包含消息ID,消息类型和一些取决于类型的可选数据.我想要一个获取消息ID,消息类型和可选数据(需要是Encode类的实例)的函数,并创建一个新的MyMessage实例,并将可选数据预先序列化为ByteString.
这就是我尝试这样做的方式:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
import Data.ByteString (ByteString)
import Data.Int
import Data.Maybe
import Data.Monoid
import Data.ProtocolBuffers
import Data.Serialize
import Data.Text (Text, pack)
import GHC.Generics (Generic)
import GHC.TypeLits
data MyMsgType = MSG_TYPE_1
| MSG_TYPE_2
deriving (Enum, Show)
data MyMessage = MyMessage {
msgId :: Required 1 (Value Int64)
, msgType :: Required 2 (Enumeration MyMsgType)
, cpData :: Optional 3 (Value ByteString)
} deriving (Generic, Show)
instance Encode MyMessage
instance Decode …Run Code Online (Sandbox Code Playgroud) 是否有更优雅的方式表达除了let posInf = 1 / 0和let negInf = -1 / 0分别在哈斯克尔的正面和负面无穷大?