当我打开某些文件类型时,我想要启动标签栏VIM插件,所以我将以下内容添加到我的.vimrc中:
if has("gui_running")
autocmd BufEnter *.hs nested TagbarOpen
Run Code Online (Sandbox Code Playgroud)
但是,这并不像我预期的那样有效.它打开一个侧窗,但侧窗不显示任何内容,我的光标被困在其中.我无法通过单击或使用CTRL-W移动命令切换窗口.
但是,当我手动运行TagbarOpen时,它工作得很好.
其他人试过这个,或上面是错误的命令发出?
在通过GHC扩展工作的同时,我遇到RankNTypes了Haskell学院,其中有以下示例:
main = print $ rankN (+1)
rankN :: (forall n. Num n => n -> n) -> (Int, Double)
rankN f = (f 1, f 1.0)
Run Code Online (Sandbox Code Playgroud)
该文章提供了另一种类型rankN:
rankN :: forall n. Num n => (n -> n) -> (Int, Double)
Run Code Online (Sandbox Code Playgroud)
对差异的解释是"后一个签名需要从n到n的函数用于某些Num n;前一个签名需要从n到n的函数,每个Num n."
我可以理解,前一种类型需要签名是括号中的或更一般的.我不明白后一个签名只需要一个n -> n"某些Num n" 功能的解释.有人可以详细阐述和澄清吗?你如何"阅读"这个以前的签名,这听起来像它的含义?后者的签名是否相同Num n => (n -> n) -> (Int, Double)而不需要forall?
我之前尝试过问这个问题,但没有明确表达我的问题,所以我会在这里再试一次.我也注意到一个非常相似的声音问题,但它要求完全不同的东西.
我有以下代码:
class Base {
func launch(code1: Int, code2: Int) { ... }
}
class A: Base {}
class B: Base {}
class C: Base {}
let classes = [A.self, B.self, A.self, B.self, C.self]
for cls in classes {
let obj = ???
}
Run Code Online (Sandbox Code Playgroud)
我想cls在循环中实例化一个类型的对象并用它做一些事情.我可能在数组中有重复项,如图所示.我应该用什么来代替???能够实例化正确的对象?
以下函数不在标准的Haskell库中,所以我写了它:
paginate _ [] = []
paginate n xs = let (h, t) = splitAt n xs in h : paginate n t
Run Code Online (Sandbox Code Playgroud)
然后我想重写它而没有明确的递归,但仍然很容易理解.
我试过这个fix版本,结果不太令人满意:
paginate = fix go
where
go _ _ [] = []
go v n xs = let (h, t) = splitAt n xs in h : v n t
Run Code Online (Sandbox Code Playgroud)
是否有更简单的解决方案使用Prelude功能?
我正在寻找一种方法来生成以下系列数字,给出左侧的版本号.例如,给定"2",生成[6,18].这一系列的数字来自这里.
V2 6 18
V3 6 22
V4 6 26
V5 6 30
V6 6 34
V7 6 22 38
V8 6 24 42
V9 6 26 46
V10 6 28 50
V11 6 30 54
V12 6 32 58
V13 6 34 62
V14 6 26 46 66
V15 6 26 48 70
V16 6 26 50 74
V17 6 30 54 78
V18 6 30 56 82
V19 6 30 58 86
V20 6 34 62 …Run Code Online (Sandbox Code Playgroud) 我在Haskell代码上使用了HLint,但并非所有的警告/错误都非常有用.特别是,箭头提示,因为我从不使用箭头.
如何让HLint忽略所有箭头提示?
如果您使用pointfree代码\b t f -> if b then t else f,您得到的答案是if'.
在哪里if'定义?
在Haskell包中Network.URI有parseURI :: String -> Maybe URI功能.
我想在我的代码中有几个静态URI.写下面的内容是否合理?
Just myURI = parseURI "http://google.com/"
Run Code Online (Sandbox Code Playgroud)
与此相关的"问题"是,如果URI字符串实际上格式错误,则仅在运行时捕获模式失败的异常.
我想避免URI直接构造数据类型的繁琐(这会破坏URI并使其在某种程度上失去其概念意义).
有没有更好的方法在代码中使用静态URI并且更"安全"?
查看Haskell Servant包,有一个将Web服务API定义为的初始示例:
-- GET /date
type MyAPI = "date" :> Get '[JSON] Date
-- GET /time/:tz
:<|> "time" :> Capture "tz" Timezone :> Get '[JSON] Time
Run Code Online (Sandbox Code Playgroud)
我无法理解这意味着什么,并希望得到以下解释:
:>并且:<|>是中缀构造函数.此类型声明是否表示它们是在此处定义的还是在此处使用?或者可能:>在这里定义但:<|>在其他地方定义?或者是其他东西?不知道如何阅读此类型.
什么是'[JSON]?这是某种类型级别的文字列表吗?报价是做什么的?
在本文中,有一个具有以下签名的函数:
vreplicate :: forall a n . SNatI n => a -> Vec a n
Run Code Online (Sandbox Code Playgroud)
这个签名和没有签名的签名有什么区别forall:
vreplicate :: SNatI n => a -> Vec a n
Run Code Online (Sandbox Code Playgroud)
?我的印象是,没有forall,它隐含地意味着forall在前面命名所有类型变量.