小编r.s*_*cky的帖子

Haskell:列表,数组,向量,序列

我正在学习Haskell,并阅读了几篇关于Haskell列表和(插入语言)数组的性能差异的文章.

作为一个学习者,我显然只是在不考虑性能差异的情况下使用列表.我最近开始调查,发现Haskell中有许多数据结构库.

有人可以解释一下列表,数组,向量,序列之间的区别,而不是深入研究数据结构的计算机科学理论吗?

此外,是否有一些常见的模式,您将使用一个数据结构而不是另一个?

是否有任何其他形式的数据结构我缺少并可能有用?

haskell

221
推荐指数
1
解决办法
3万
查看次数

打字稿:反应事件类型

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)

javascript typescript reactjs

91
推荐指数
8
解决办法
10万
查看次数

Parsec:"try"和"lookAhead"之间的区别?

parsec中"try"和"lookAhead"函数有什么区别?

haskell parsec

21
推荐指数
1
解决办法
2684
查看次数

Scotty:连接池作为monad阅读器

有数以万亿计的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)

haskell haskell-wai scotty

19
推荐指数
1
解决办法
1865
查看次数

Haskell:在源代码中指定版本的正确做法?

在源代码树中指定版本的最佳/正确做法是什么?我想要的是,例如,将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文件中的版本号,以便在我的源代码中传播它.正是我需要的.谢谢.

haskell

17
推荐指数
1
解决办法
543
查看次数

Haskell:与自己的数据类型混淆.记录语法和唯一字段

我刚刚发现了这种混乱,并想确认它是什么.当然,除非我错过了一些东西.

说,我有这些数据声明:

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(或任何其他无唯一字段)属于哪种数据类型并返回正确的结果?

  • 如果我有几个具有相同字段名称的声明,那么处理这个问题的正确方法是什么?


作为旁注.

通常,我需要返回类似于上面示例的数据类型.首先我将它们作为元组返回(当时在我看来是正确的方式).但是元组很难处理,因为不可能像使用"!!"的列表一样简单地提取复杂类型的单个部分.接下来我想到了词典/哈希.当我尝试使用字典时,我认为拥有自己的数据类型有什么意义呢?播放/学习数据类型我遇到了导致上述问题的事实.所以看起来我更容易使用字典而不是自己的数据类型,因为我可以为不同的对象使用相同的字段.


能否详细说明一下,告诉我它在现实世界中的表现如何?

haskell

13
推荐指数
4
解决办法
4611
查看次数

Haskell,Snap:简单的snaplet结构.我们什么时候使用snaplet和库?

我想了解简单的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 haskell-snap-framework

9
推荐指数
1
解决办法
751
查看次数

Haskell:Unix域套接字

我找不到关于在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.谢谢.

haskell unix-socket

8
推荐指数
1
解决办法
1446
查看次数

Haskell:从/ proc读取.严格和懒惰的问题.流程统计

从/ 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)

linux haskell system

8
推荐指数
2
解决办法
363
查看次数

Haskell:严格按顺序执行外部命令

如果我需要按顺序执行外部命令,那么最佳解决方案是什么?

例如,我有两个命令"make snapshot"和"backup snapshot".第二个命令在第一个完成之前无法启动.如果我有条不紊地将这两个命令粘贴在do语法中,它们会一个接一个地执行,还是我必须手动检查并确保第一个完成?

对于手动完成检查,是否足以使用"system"或rawSystem"并检查它们的退出代码?

我不完全理解"system"和"runCommand"函数之间的区别.有人可以向我澄清这一点.我只能看到它们返回不同的值:退出代码与进程句柄.还有其他差异吗?

我是否宁愿使用"runCommand"来完成上述序列?我是否需要在进程句柄上调用wait?

谢谢.

haskell

7
推荐指数
1
解决办法
1762
查看次数