我正在学习Haskell,并阅读了几篇关于Haskell列表和(插入语言)数组的性能差异的文章.
作为一个学习者,我显然只是在不考虑性能差异的情况下使用列表.我最近开始调查,发现Haskell中有许多数据结构库.
有人可以解释一下列表,数组,向量,序列之间的区别,而不是深入研究数据结构的计算机科学理论吗?
此外,是否有一些常见的模式,您将使用一个数据结构而不是另一个?
是否有任何其他形式的数据结构我缺少并可能有用?
React事件的正确类型是什么.最初我只是any为了简单起见而使用.现在,我正在努力清理并避免any完全使用.
所以用这样一个简单的形式:
export interface LoginProps {
login: {
[k: string]: string | Function
uname: string
passw: string
logIn: Function
}
}
@inject('login') @observer
export class Login extends Component<LoginProps, {}> {
update = (e: React.SyntheticEvent<EventTarget>): void => {
this.props.login[e.target.name] = e.target.value
}
submit = (e: any): void => {
this.props.login.logIn()
e.preventDefault()
}
render() {
const { uname, passw } = this.props.login
return (
<div id='login' >
<form>
<input
placeholder='Username'
type="text"
name='uname'
value={uname}
onChange={this.update}
/>
<input
placeholder='Password'
type="password" …Run Code Online (Sandbox Code Playgroud) 有数以万亿计的monad教程,包括读者,当你阅读它时似乎都很清楚.但是当你真正需要写作时,它就变成了另一回事.
我从未使用过读者,只是在实践中从未使用过.所以尽管我读到了它,但我不知道如何去做.
我需要在Scotty中实现一个简单的数据库连接池,以便每个操作都可以使用该池.该池必须是"全局的",并且可由所有操作功能访问.我读到了这样做的方法是Reader monad.如果还有其他方式,请告诉我.
你能帮我一下,并正确地说明如何用Reader做这个吗?如果我看到自己的例子如何完成,我可能会学得更快.
{-# LANGUAGE OverloadedStrings #-}
module DB where
import Data.Pool
import Database.MongoDB
-- Get data from config
ip = "127.0.0.1"
db = "index"
--Create the connection pool
pool :: IO (Pool Pipe)
pool = createPool (runIOE $ connect $ host ip) close 1 300 5
-- Run a database action with connection pool
run :: Action IO a -> IO (Either Failure a)
run act = flip withResource (\x -> access x master db act) =<< …Run Code Online (Sandbox Code Playgroud) 在源代码树中指定版本的最佳/正确做法是什么?我想要的是,例如,将VERSION文件放在源树的顶层,并获取"版本"函数来读取它.
cabal文件中有一个版本部分.是否可以通过"帮助"或"版本"功能从我的源代码中读取它?在一个地方指定版本并使其可用于球形的正确做法是什么?
PS Cabal库中是否有任何功能允许您从cabal文件中提取任何部分并将其显示在源代码中?然后我可以简单地从cabal文件中提取版本部分.
- 更新 -
感谢Thomas对Pathes_x模块的一个很好的了解.只是想补充一点,显然,我不需要在我的cabal文件中添加任何内容.一切都没有它.我需要的就是在你吸气的时候输入Pathes_X.此外,我需要导入Data.Version以获取showVersion函数以正确格式化/打印Version数据类型.所以最后我得到这样的东西:
import Paths_kvman
import Data.Version
runVersion _ = putStrLn ("Version: " ++ (showVersion version))
Run Code Online (Sandbox Code Playgroud)
现在,我需要的是更改cabal文件中的版本号,以便在我的源代码中传播它.正是我需要的.谢谢.
我刚刚发现了这种混乱,并想确认它是什么.当然,除非我错过了一些东西.
说,我有这些数据声明:
data VmInfo = VmInfo {name, index, id :: String} deriving (Show)
data HostInfo = HostInfo {name, index, id :: String} deriving (Show)
vm = VmInfo "vm1" "01" "74653"
host = HostInfo "host1" "02" "98732"
Run Code Online (Sandbox Code Playgroud)
我一直以来的想法以及看起来如此自然和合乎逻辑的是:
vmName = vm.name
hostName = host.name
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用.我懂了.
所以我的问题是.
当我使用记录语法创建数据类型时,是否必须确保所有字段都具有唯一名称?如果是 - 为什么?
是否有一种干净的方式或类似于"范围解析运算符"的东西,如::或.等,以便Haskell区分name(或任何其他无唯一字段)属于哪种数据类型并返回正确的结果?
如果我有几个具有相同字段名称的声明,那么处理这个问题的正确方法是什么?
通常,我需要返回类似于上面示例的数据类型.首先我将它们作为元组返回(当时在我看来是正确的方式).但是元组很难处理,因为不可能像使用"!!"的列表一样简单地提取复杂类型的单个部分.接下来我想到了词典/哈希.当我尝试使用字典时,我认为拥有自己的数据类型有什么意义呢?播放/学习数据类型我遇到了导致上述问题的事实.所以看起来我更容易使用字典而不是自己的数据类型,因为我可以为不同的对象使用相同的字段.
能否详细说明一下,告诉我它在现实世界中的表现如何?
我想了解简单的snaplet结构.另外,我什么时候需要制作一个snaplet和一个简单的侧库?如果我确实需要一个如何从库中取出它?
例如,我有一堆数据库函数,我在其中包装我的SQL代码,如下所示.
data Person = Person {personName :: ByteString, personAge :: Int}
connect :: IO Connection
connect = connectSqlite3 "/somepath/db.sqlite3"
savePerson :: Person -> IO ()
savePerson p = do
c <- connect
run c "INSERT INTO persons (name, age) \
\VALUES (?, ?)"
[toSql (personName p), toSql (personAge p)]
commit c
disconnect c
Run Code Online (Sandbox Code Playgroud)
每个函数都会启动一个新连接并在提交后关闭连接.我想制作一个snaplet是避免每个功能连接的方法吗?在我的处理程序中,我会像这样使用它:
insertPerson :: Handler App App ()
insertPerson = do
par <- getPostParams
let p = top par
liftIO $ savePerson p
where
top m = …Run Code Online (Sandbox Code Playgroud) 我找不到关于在Haskell中处理Unix Domain套接字的好信息.我需要一个简单的函数来打开一个套接字并向它写一个命令.任何人都可以帮我提一下在哪里阅读或者举个例子吗?
基本上,我需要移植这个简单的Ruby函数(如果它有助于理解我的意思):
def monitor(string_command)
require "socket"
socket = File.join($vbase, @name, "monitor.soc")
raise RuntimeError, "Monitor socket does not exst!" unless File.exist? socket
begin
UNIXSocket.open(socket) do |s|
s.puts string_command
s.flush
end
rescue
return false
end
true
end
Run Code Online (Sandbox Code Playgroud)
它只会打开套接字并向其写入命令,成功后返回true.谢谢.
从/ proc读取文件时我有一些奇怪的行为如果我使用prelude的readFile懒惰地读取/ proc/pid/stat - 它可以工作但不是我想要的方式.使用Data.ByteString.readFile切换到严格读取会给我一个空字符串.
我需要在这里严格阅读,以便能够在短时间内比较两次读取的结果.
所以使用System.IO.readFile读取/ proc/pid/stat根本不起作用.它在0.5秒的间隔内给出了相同的结果.我认为这是由于懒惰和半闭合的句柄或其他东西......打开和关闭文件句柄明确地工作.
h <- openFile "/proc/pid/stat" ReadMode
st1 <- hGetLine h; hClose h
Run Code Online (Sandbox Code Playgroud)
但是,如果我们对bytestring进行严格读取,为什么还要这样做呢?对?
这是我被卡住的地方.
import qualified Data.ByteString as B
B.readFile "/proc/pid/stat" >>= print
Run Code Online (Sandbox Code Playgroud)
这总是返回一个空字符串.也在GHCI中测试过.有什么建议.谢谢.
--- 更新 ---
感谢Daniel的建议.
这是我实际需要做的.这可能有助于充分显示我的困境并提出更多一般性建议.
我需要计算流程统计数据.以下是代码的一部分(仅用CPU使用情况)作为示例.
cpuUsage pid = do
st1 <- readProc $ "/proc" </> pid </> "stat"
threadDelay 500000 -- 0.5 sec
st2 <- readProc $ "/proc" </> pid </> "stat"
let sum1 = (read $ words st1 !! 13) +
(read $ words st1 !! 14) …Run Code Online (Sandbox Code Playgroud) 如果我需要按顺序执行外部命令,那么最佳解决方案是什么?
例如,我有两个命令"make snapshot"和"backup snapshot".第二个命令在第一个完成之前无法启动.如果我有条不紊地将这两个命令粘贴在do语法中,它们会一个接一个地执行,还是我必须手动检查并确保第一个完成?
对于手动完成检查,是否足以使用"system"或rawSystem"并检查它们的退出代码?
我不完全理解"system"和"runCommand"函数之间的区别.有人可以向我澄清这一点.我只能看到它们返回不同的值:退出代码与进程句柄.还有其他差异吗?
我是否宁愿使用"runCommand"来完成上述序列?我是否需要在进程句柄上调用wait?
谢谢.
haskell ×9
haskell-wai ×1
javascript ×1
linux ×1
parsec ×1
reactjs ×1
scotty ×1
system ×1
typescript ×1
unix-socket ×1