小编Sta*_*iff的帖子

参数多态与高等级类型有什么区别?

我很确定他们不一样.然而,我被"Rust不支持"高级类型(HKT)的常见概念所困扰,而是提供参数多态性.我试图了解这一点并理解它们之间的区别,但却变得越来越纠结.

根据我的理解,Rust中有高级的类型,至少是基础知识.使用"*" - 符号,HKT确实有一种例如* -> *.例如,Maybe是善良的* -> *,可以在Haskell中像这样实现.

data Maybe a = Just a | Nothing
Run Code Online (Sandbox Code Playgroud)

这里,

  • Maybe 是一个类型构造函数,需要应用于具体类型才能成为类型"*"的具体类型.
  • Just a并且Nothing是数据构造函数.

在关于Haskell的教科书中,这通常被用作高级类型的示例.但是,在Rust中它可以简单地实现为枚举,毕竟它是一个和类型:

enum Maybe<T> {
    Just(T),
    Nothing,
}
Run Code Online (Sandbox Code Playgroud)

区别在哪里?据我所知,这是一个更好的类型的完美的例子.

  1. 如果在Haskell中这被用作HKT的教科书示例,为什么说Rust没有HKT?不将Maybe枚举资格作为一个HKT?
  2. 是否应该说Rust不完全支持HKT?
  3. HKT和参数多态之间的根本区别是什么?

在查看函数时,这种混淆仍在继续,我可以编写一个参数函数,它Maybe可以将HKT作为函数参数.

fn do_something<T>(input: Maybe<T>) {
    // implementation
}
Run Code Online (Sandbox Code Playgroud)

再次,在Haskell中会是这样的

do_something :: Maybe a -> ()
do_something :: Maybe a -> ()
do_something _ = ()
Run Code Online (Sandbox Code Playgroud)

这导致了第四个问题.

  1. 对高等级类型的支持到底在哪里?什么是使Rust的类型系统无法表达HKT的最小例子? …

haskell type-theory higher-kinded-types rust parametric-polymorphism

34
推荐指数
4
解决办法
2459
查看次数

溶解重叠多边形(使用 GDAL/OGR),同时保持非连接结果不同

有没有办法使用任何 GDAL/OGR API 或命令行工具来溶解(合并)重叠的多边形,同时保持生成的非重叠区域不同?我已经搜索了很多,但找不到任何类似于需要的东西。不过,我认为这个问题不太可能还没有解决。

这是我需要的更详细的描述:

  • 我的输入由具有单层的单个形状文件(ESRI Shapefile)组成。
  • 该图层包含无法通过属性区分的多边形。(都具有相同的属性)。
  • 其中许多是重叠的,我希望将重叠的那些合并起来。
  • 未连接的区域应产生单独的多边形。

这是造成麻烦的最后一点。除了最后一点之外,我基本上得到了我需要的东西。如果我运行溶解形状文件的典型解决方案

$ ogr2ogr -f "ESRI Shapefile" dissolved.shp input.shp -dialect sqlite -sql "select ST_union(Geometry) from input"
Run Code Online (Sandbox Code Playgroud)

我最终得到一个包含所有内容的多边形,即使这些区域没有连接。

更新: 我通过完全放弃 GDAL 解决了这个问题。正如许多消息来源指出的那样,使用 fiona 和 shapely 来处理 shapefile 通常是更好的方法。我在下面发布了我的解决方案。

python gdal ogr shapely fiona

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

STM32CubeMX HAL_xxx_MspInit()函数中的MSP代表什么?

我想知道HAL_xxx_MspInit()回调中的缩写"MSP" 代表什么.我在一些固件驱动程序中看到过,比如ST的HAL库.例如:

void HAL_UART_MspInit(UART_HandleTypeDef *huart);
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi);
Run Code Online (Sandbox Code Playgroud)

来自stm32f3xx_hal_uart.hstm32f3xx_hal_spi.h.我想知道是什么意思Msp.它只是init驱动程序中函数回调的命名约定,还是具有更深层含义(我怀疑它有什么).

c embedded driver firmware

5
推荐指数
1
解决办法
6415
查看次数

从外部托管的Jupyter Notebook下载时动态提供文件服务

我正在使用托管在外部服务器上的Jupyter Notebook,即用户只能通过Jupyter Notebook来访问服务器。我正在寻找一种方式在这样的Jupyter Notebook中工作的用户可以将其结果下载为直接从Jupyter服务器提供的文件。

这是一个小例子来说明我想要实现的目标:

# this code runs inside a Jupyter Notebook
import pandas as pd

testdata = { 'a' : [1,2,3,4],
             'b' : ['Hotel', 'Bed', 'Beer', 'TV']}

dataset = pd.DataFrame(testdata)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种用户友好的方式来下载该数据集(通常,用户正在做很多处理,在准备好下载数据之前进行重塑)。

例如这样:

mytools.download_dataframe_as_hdf(dataset)
Run Code Online (Sandbox Code Playgroud)

要么

dataset.to_hdf('test.hdf', 'test')
mytools.download_file('test.hdf')
Run Code Online (Sandbox Code Playgroud)

是否有内置功能或巧妙的方式来实现这一目标?

编辑:改进了简单的解决方案。

HTML一旦文件存在于服务器的文件系统上,使用IPython.display`就可以轻松显示链接。

from IPython.display import HTML

HTML('<a href="test.hdf">download hdf</a>')
Run Code Online (Sandbox Code Playgroud)

但是,我想找到一种通过缓冲流为数据提供服务的解决方案,即避免先将数据转储到本地文件系统上。任何想法如何以pythonic方式实现此功能?

python hosted jupyter-notebook

5
推荐指数
0
解决办法
717
查看次数

在堆栈中运行测试套件的惯用法

Haskell初学者在这里.

我正在努力找到一种很好的方法来运行我在我的.cabal文件中定义的测试套件.鉴于您test-suite.cabal文件中添加了部分,我希望您可以使用单个命令来运行所有部分stack runtests.

我找到的最佳答案是: Haskell Stack Ghci测试套件,建议您必须运行

stack ghci --test module:test:libtests

然而,有两件事让我很恼火,我认为必须有一个更好的方法.

  1. stack ghci --test module:test:libtests明确地调用是很麻烦的.如果我在项目变大时有更多的测试套件,我不想这样做.
  2. 更糟糕的是,我最终进入了互动环节,不得不给main自己打电话.这不规模.

是不是有更好的方法来为堆栈项目运行测试套件?当然我可以做一些shell脚本,但是嘿堆栈应该知道如何运行我的测试,我在.cabal文件中指定了所有内容.

我试过stack runghc --test但这没有用.

项目设置:

.
??? app
?   ??? Main.hs
??? LICENSE
??? README.md
??? Setup.hs
??? src
?   ??? Lib.hs
?   ??? WordNumber.hs
??? stack.yaml
??? test
?   ??? Spec.hs
??? WordNumber.cabal
Run Code Online (Sandbox Code Playgroud)

WordNumber.cabal

name:                WordNumber
version:             0.1.0.0
-- synopsis:
-- description:
homepage:            https://github.com/githubuser/WordNumber#readme …
Run Code Online (Sandbox Code Playgroud)

testing haskell haskell-stack

5
推荐指数
1
解决办法
848
查看次数

是否可以推迟goroutine?

是否有可能推迟一个例程,或一种实现所需行为的方法?以下背景:我正在汇集到通道中数据库的连接.基本上在我打电话的处理程序中

session, err := getSessionFromQueue()
// ...
// serving content to my client
// ...
go queueSession(session)
Run Code Online (Sandbox Code Playgroud)

我真正想做的是:

session, err := getSessionFromQueue()
defer go queueSession(session)
// ...
// serving content to my client
// ...
Run Code Online (Sandbox Code Playgroud)

避免我的处理程序在某个时刻挂起/崩溃并且会话未正确返回队列.我想将它作为go例程运行的原因queueSession是可能阻塞1秒(如果队列已满,我在完全关闭会话之前等待一秒钟).

更新

@abhink让我走上了正确的轨道.我通过调用goroutine来解决问题queueBackend.

func queueSession(mongoServer *Server) {
    go func(mongoServer *Server) {
        select {
        case mongoQueue <- mongoServer:
            // mongoServer stored in queue, done.
        case <- time.After(1 * time.Second):
            // cannot queue for whatever reason after 1 second
            // abort
            mongoServer.Close()
        } …
Run Code Online (Sandbox Code Playgroud)

go goroutine deferred

4
推荐指数
1
解决办法
2561
查看次数

http.Handle包装模式 - >堆栈会膨胀吗?

我正在做第一个生产web服务,所以我对语言和一些概念/模式很新.

我的问题与处理程序有关,本质上是如何在不降低性能的情况下提取重复代码.

我已经来到了整个模式来包装http.Handlehttp.HandlerFunc清理代码.例如,此博客文章使用适配器模式https://medium.com/@matryer/writing-middleware-in-golang-and-how-go-makes-it-so-much-fun-4375c1246e81#.hvsc236iv

它可能最终会有这样的东西(从blob帖子中复制):

http.Handle("/", Adapt(indexHandler, AddHeader("Server", "Mine"),
                                 CheckAuth(providers),
                                 CopyMgoSession(db),
                                 Notify(logger), 
                               )
Run Code Online (Sandbox Code Playgroud)

这基本上是一个深度嵌套的函数调用.

我的问题是堆栈中发生了什么以及服务的性能?使用此模式,每个用户请求将向堆栈添加至少5个堆栈帧.这是可以接受的,还是会在流量高时对性能产生负面影响?

performance stack http go

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