在SO上搜索" vim haskell indent ".关于如何为Haskell缩进配置Vim有很多答案.他们都没有真正"工作".它们不提供Haskell缩进维基页面建议的代码.例如,do或let块中的语句对齐,数据类型=和|数据类型等.
是否存在生成wiki等代码的Vim解决方案?
我可以做以下事情:
Prelude> reads "1 2 3" :: [(Int, String)]
[(1," 2 3")]
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)]
[((1,2)," (3,4)")]
Prelude> reads "(1,2)(3,4)" :: [((Int, Int), String)]
[((1,2),"(3,4)")]
Prelude> reads "(1,2)\n(3,4)" :: [((Int, Int), String)]
[((1,2),"\n(3,4)")]
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)]
[((1,2)," (3,4)")]
Run Code Online (Sandbox Code Playgroud)
我可以派生Read并阅读以阅读这些内容.但是我从来没有得到过读取来返回列表中的多个元组.为什么要reads返回一个清单?
假设我有一些表示网络连接的对象.断开这些连接后,关联的对象将消失.我不想挂在不再连接的连接对象上.
我还想使用字典将一些数据与这些连接相关联.所以我可能有代码:
class Connection { ... }
class Metadata { ... }
var metadata: [Connection: Metadata] = [:]
Run Code Online (Sandbox Code Playgroud)
但是上面的代码意味着字典将保留对Connection我不想要的对象的引用.当Connection对象消失时,我更愿意删除关联的条目,理想情况是自动删除.
所以我尝试过:
var metadata: [weak Connection: Metadata] = [:]
Run Code Online (Sandbox Code Playgroud)
但这不起作用.什么是一个很好的替代解决方案?
说我有以下内容:
data Rec = Rec {
alpha :: Int,
beta :: Double,
phi :: Float
}
sample = Rec 1 2.3 4.5
Run Code Online (Sandbox Code Playgroud)
我理解模板Haskell和reify函数可以得到记录的字段名称.那是:
print $(f sample) --> ["alpha", "beta", "phi"]
Run Code Online (Sandbox Code Playgroud)
还有一种说法是,这可以在没有Template Haskell的情况下完成.有人可以为此提供一个示例实现吗?
我对下面会话结束时收到的错误感到困惑:
$ ghci
GHCi, version 7.10.2: http://www.haskell.org/ghc/ :? for help
Ok, modules loaded: Main.
*Main> :set -XDataKinds
*Main> :t [False, True]
[False, True] :: [Bool]
*Main> :t [False]
[False] :: [Bool]
*Main> :k [False, True]
[False, True] :: [Bool]
*Main> :k [False]
<interactive>:1:2:
Expected kind ‘*’, but ‘False’ has kind ‘Bool’
In a type in a GHCi command: [False]
Run Code Online (Sandbox Code Playgroud)
为什么错误?
未来的实验揭示:
*Main> :k [Int]
[Int] :: *
*Main> :k [Int, Int]
[Int, Int] :: [*]
Run Code Online (Sandbox Code Playgroud)
[Int]可以有人居住的价值,所以它是善良的*,但它也是有意义的[*] …
我有以下代码:
import CoreBluetooth
class BrowserSample: NSObject, CBCentralManagerDelegate {
let central : CBCentralManager
init() {
central = CBCentralManager(delegate: self, queue: nil, options: nil)
super.init()
}
func centralManagerDidUpdateState(central: CBCentralManager!) { }
}
Run Code Online (Sandbox Code Playgroud)
如果我central =之前把线放super.init(),那我得到错误:
self used before super.init() call
Run Code Online (Sandbox Code Playgroud)
如果我把它放在后面,我得到错误:
Property self.central not initialized at super.init call
Run Code Online (Sandbox Code Playgroud)
所以,我很困惑.我该怎么做呢?
如果我有一个Traversable实例,xs我该如何将其转换为Vector?
在Python中你可以这样写:
def firstn(n):
num = 0
while num < n:
yield num
num += 1
Run Code Online (Sandbox Code Playgroud)
什么是lisp相当于此?
仍在Haskell中处理我的SHA1实现.我现在有一个工作实现,这是内循环:
iterateBlock' :: Int -> [Word32] -> Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> [Word32]
iterateBlock' 80 ws a b c d e = [a, b, c, d, e]
iterateBlock' t (w:ws) a b c d e = iterateBlock' (t+1) ws a' b' c' d' e'
where
a' = rotate a 5 + f t b c d + e + w + k t
b' = a
c' = rotate b 30
d' = c
e' …Run Code Online (Sandbox Code Playgroud) 说我有以下记录:
data Rec = Rec {
field1 :: Int,
field2 :: Int
}
Run Code Online (Sandbox Code Playgroud)
我该如何编写这个函数:
changeField :: Rec -> String -> Int -> Rec
changeField rec fieldName value
Run Code Online (Sandbox Code Playgroud)
这样我可以将字符串"field1"或"field2"传入fieldName参数并让它更新相关字段?我理解Data.Data并且Data.Typeable在这里使用的是什么,但我无法想出这两个包.
我见过的库的一个例子就是cmdArgs.以下是关于如何使用此库的博客文章的摘录:
{-# LANGUAGE DeriveDataTypeable #-}
import System.Console.CmdArgs
data Guess = Guess {min :: Int, max :: Int, limit :: Maybe Int} deriving (Data,Typeable,Show)
main = do
x <- cmdArgs $ Guess 1 100 Nothing
print x
Run Code Online (Sandbox Code Playgroud)
现在我们有一个简单的命令行解析器.一些示例交互是:
$ guess --min=10
NumberGuess {min = 10, …Run Code Online (Sandbox Code Playgroud) haskell ×7
swift ×2
common-lisp ×1
data-kinds ×1
dictionary ×1
generator ×1
indentation ×1
ios ×1
lisp ×1
optimization ×1
record ×1
reify ×1
traversable ×1
vector ×1
weak ×1