小编Sav*_*nel的帖子

我什么时候想使用Free Monad + Interpreter模式?

我正在开发一个项目,除其他外,涉及数据库访问层.非常正常,真的.在之前的项目中,合作者鼓励我将Free Monads概念用于数据库层,所以我做到了.现在,我正在尝试在我的新项目中决定我获得了什么.

在之前的项目中,我有一个看似相似的API.

saveDocument :: RawDocument -> DBAction ()
getDocuments :: DocumentFilter -> DBAction [RawDocument]
getDocumentStats :: DBAction [(DocId, DocumentStats)]
Run Code Online (Sandbox Code Playgroud)

大约二十个这样的公共职能.为了支持它们,我有了DBAction数据结构:

data DBAction a =
      SaveDocument          RawDocument         (DBAction a)
    | GetDocuments          DocumentFilter      ([RawDocument] -> DBAction a)
    | GetDocumentStats                          ([(DocId, DocumentStats)] -> DBAction a)
    | Return a
Run Code Online (Sandbox Code Playgroud)

然后是monad实现:

instance Monad DBAction where
    return = Return
    SaveDocument doc k >>= f = SaveDocument doc (k >>= f)
    GetDocuments df k >>= f = GetDocuments df (k >=> f)
Run Code Online (Sandbox Code Playgroud)

然后是口译员.然后是实现每个不同查询的原始函数.基本上,我觉得我有大量的胶水代码.


在我当前的项目中(在一个完全不同的领域),我已经为我的数据库添加了一个非常普通的monad: …

monads dsl haskell free-monad

38
推荐指数
1
解决办法
2961
查看次数

建立一个基于构建平台需要不同依赖关系的leiningen项目的优雅方法是什么?

为了进行一些多平台的GUI开发,我刚刚从GTK + Clojure(因为看起来GTK的Java绑定从未被移植到Windows)切换到SWT + Clojure.到目前为止,我已经为Linux构建了一个uberjar.

但问题是,我想为Windows构建一个uberjar,我正试图找到一种管理project.clj文件的简洁方法.

起初,我以为我会将类路径设置为指向SWT库,然后构建uberjar.这需要我在运行jar之前设置一个类路径到SWT库,但无论如何我可能需要一个启动器脚本.但是,leiningen似乎忽略了这个实例中的类路径,因为它总是报告这一点

目前,project.clj对我来说是这样的:

(defproject alyra.mana-punk/character "1.0.0-SNAPSHOT"
  :description "FIXME: write"
  :dependencies [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib "1.2.0"]
                 [org.eclipse/swt-gtk-linux-x86 "3.5.2"]]
  :main alyra.mana-punk.character.core)
Run Code Online (Sandbox Code Playgroud)

相关的行是org.eclipse/swt-gtk-linux-x86行.如果我想为Windows做一个uberjar,我必须依赖org.eclipse/swt-win32-win32-x86,另一个用于x86-64,依此类推.

我目前的解决方案是使用不同的project.clj为每个构建环境创建一个单独的分支.这似乎有点像使用半成品来提供一加仑牛奶,但我使用集市进行版本控制,因此分支和重复集成很容易.也许更好的方法是有一个project.linux.clj,project.win32.clj等,但我没有看到任何方法告诉leiningen使用哪个项目描述符.

什么是其他(最好是更优雅)的方式来建立这样的环境?

cross-platform clojure leiningen

13
推荐指数
1
解决办法
1663
查看次数

在haskell中,如何根据当前语言环境大写unicode字符

事实证明,对一个角色进行大写是一项复杂的工作.如果退出基本的ASCII字符集,则为字符大写字母和小写字符的规则实际上取决于运行应用程序的语言环境.

作为演示应用程序,我试图用字母'i'(带点)和字母'i'(没有点)来大写.现在,在en_US中,'i'(带点)大写为'I','i'(没有点)不存在(但仍然是大写'I').

但是,如果我切换到土耳其语(tr_TR.UTF-8),'i'(带点)必须大写为'İ'(也带点)和'ı'(没有点)必须大写为'I' (也没有点).小写应该反转这些操作.

i??I --> ??II  (tr_TR.UTF-8)
i??I --> I?II  (en_US.UTF-8)
Run Code Online (Sandbox Code Playgroud)

现在,我可以在C中完美地做到这一点.我怎么能在Haskell中做到这一点?我所做的所有搜索都直接指向Data.Char.toUpper,它不支持区域设置.我没有找到任何以语言环境感知的函数.


这是来自C的代码示例.我在我的Linux机器上运行它.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wctype.h>
#include <string.h>
#include <errno.h>

wchar_t latin_small_sharp_s[5] = {0x00df, 0x00df, 0x0053, 0x0053, 0};
wchar_t turkish_is[5] = {0x0069, 0x0130, 0x0131, 0x0049, 0};

char multibyte_turkish_is[7] = {0x69, 0x01, 0x30, 0x01, 0x31, 0x49, 0};

void print_in_locale (const char *locale, const wchar_t *str, const size_t len) {
  wchar_t *dest = calloc(len * 2, sizeof(wchar_t));
  int i;

  if (!setlocale(LC_CTYPE, locale)) {
    fprintf(stderr, "Locale %s …
Run Code Online (Sandbox Code Playgroud)

unicode haskell

10
推荐指数
1
解决办法
661
查看次数

How do I parse a large data block into memory in Haskell?

On reflection, this entire question can be boiled down to something much more concise. I'm looking for a Haskell data structure that

  • looks like a list
  • has O(1) lookup
  • has either O(1) element replacement or O(1) element append (or prepend... I could reverse my index lookups if that were the case). I can always write my later algorithms with one or the other in mind.
  • has very little memory overhead

I'm trying to build an image file parser. The file …

performance haskell space-leak

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

如何提高在clojure中对两个数组进行操作的函数的性能

我有一组少量的功能.两个函数进行数学叠加操作(定义http://docs.gimp.org/en/gimp-concepts-layer-modes.html,但有点下来-只要搜索"叠加",找到数学)在不同的方法.现在,这个操作是Gimp在一秒钟之内做得很快的事情,但是我似乎无法优化我的代码以获得类似于远程类似时间的任何东西.

(我的应用程序是一个GUI应用程序,可以帮助我查看和比较大量文件的各种叠加组合.Gimp层界面实际上很难选择两个图像叠加,然后选择不同的两个,等等)

这是代码:

(set! *warn-on-reflection* true )

(defn to-8-bit [v]
  (short (* (/ v 65536) 256)))

(defn overlay-sample [base-p over-p]
  (to-8-bit 
    (* (/ base-p 65536) 
       (+ base-p
          (* (/ (* 2 over-p) 65536)
             (- 65536 base-p))))))

(defn overlay-map [^shorts base ^shorts over]
  (let [ovl (time (doall (map overlay-sample ^shorts base ^shorts over)))]
    (time (into-array Short/TYPE ovl))))

(defn overlay-array [base over]
  (let [ovl (time (amap base
                        i
                        r
                        (int (overlay-sample (aget r i)
                                             (aget over i)))))]
    ovl))
Run Code Online (Sandbox Code Playgroud)

overlay-map和overlay-array以不同的方式执行相同的操作.我也写了这个操作的其他版本.然而,到目前为止,叠加图是我所拥有的最快的.

base和over两个函数都是16位整数数组.每个样本的实际大小为1,276,800个样本(800 …

clojure mathematical-optimization micro-optimization

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

处理一个monad调用另一个monad的干净方法是什么?

这是将monad粘合在一起的问题.不是堆栈形式,而是需要打开一个monad以在另一个内部运行操作的形式.

两个领域:Weblog和App.但是,请记住,App域将以与当前调用Weblog相同的方式调用其他域.两者都有自己的monad堆栈.两者都记录着自己的状态.

newtype WeblogM a = WeblogM (ReaderT Weblog (ErrorT WeblogError IO) a)
    deriving (Monad, MonadIO, Reader.MonadReader Weblog, Error.MonadError WeblogError)

newtype AppM a = AppM (ReaderT App (EitherT AppError IO) a)
    deriving ( Functor, Applicative, Monad
             , MonadReader App, MonadError AppError)
Run Code Online (Sandbox Code Playgroud)

为了WeblogMAppM函数内部运行一个操作,我发现我必须WeblogM使用这样的函数解包并重新包装它:

runWeblogHere :: forall a. Weblog.Weblog -> Weblog.WeblogM a -> AppM a
runWeblogHere weblog action =
    runIO (left . WeblogError) (Weblog.runWeblog weblog action)

runIO :: (e -> EitherT AppError IO a) -> IO …
Run Code Online (Sandbox Code Playgroud)

monads haskell monad-transformers

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

使用"堆栈测试"时,我的hspec测试输出没有着色

这是一件令人愤怒的事情,因为我已经构建了基于Hspec的测试套件,其中颜色都表现正常.但是在这个项目中,当我一次运行所有测试套件时,我无法显示颜色.

我的project.cabal设置如下:

test-suite unit
  type:               exitcode-stdio-1.0
  main-is:            SpecMain.hs
  hs-source-dirs:     tests/unit
  other-modules:      WikiSpec
  default-language:   Haskell2010
  ghc-options:        -Wall -fno-warn-orphans -threaded
  build-depends:      base                    >=4.6
  ...

test-suite integration
  type:               exitcode-stdio-1.0
  main-is:            SpecMain.hs
  hs-source-dirs:     tests/integration, webapp
  other-modules:      ApiSpec
  default-language:   Haskell2010
  ghc-options:        -Wall -fno-warn-orphans -threaded
  build-depends:      base                    >=4.6
  ...
Run Code Online (Sandbox Code Playgroud)

然后我的SpecMain.hs文件(相同)包含:

{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
Run Code Online (Sandbox Code Playgroud)

因此,当我运行时,我的stack test所有测试都会运行,但输出没有着色.如果我运行stack build --file-watch --test,测试运行,但如果有任何故障,则所有输出都显示为红色.最后,如果我跑stack test weblog:unit或者stack test weblog:integration,那么颜色最终会完全按照它们的样子结束.标题为白色,通过测试为绿色,失败测试为红色,待定测试为黄色.

当我正在积极开发时,我倾向于依赖stack build --file-watch --test,但我真的需要颜色是正确的.

你们有没有人知道发生了什么,我如何解决这个问题,或者我需要提供哪些其他信息?

haskell unit-testing haskell-stack

6
推荐指数
1
解决办法
601
查看次数

为什么我的"apply"标签不再适用于Heist 0.11.0.1?

我最近升级了我正在使用的Heist版本.这主要是一个随意的决定,我仍然看到该行动的后果,主要是更令人愉快的代码结构.

但是,我非常依赖模板中的"apply"标签来引入样板组件,例如我的站点标题和菜单.对我来说,典型的模板如下所示:

<html>
<head>
    <title> <PageTitle /> </title>
    <link rel="stylesheet" type="text/css" href="/styles/style.css" />
    <link rel="alternate" type="application/rss+xml" title="${PageTitle} Feed" href="http://www.savannidgerinel.com/rss" />
</head>
<body class="center">

<apply template="header" />

<div id="content">
<h1><PageTitle /></h1>
<ul>
<PageMetadata />
</ul>

<PageContent />
</div>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

而且,我现在正在加载这样的模板:

setup_heist template_dir = do
    templates <- Heist.loadTemplates template_dir
    hs <- Heist.initHeist (Heist.HeistConfig [] [] [] [] templates)
    return hs
Run Code Online (Sandbox Code Playgroud)

这与我以前加载模板的方式(仍然使用该loadTemplates函数)没有太大的不同,但它是设置我不习惯的Heist状态的另一种方式.

但是,现在没有apply任何标签有任何影响.我的"包含"模板永远不会加载,在生成的HTML中我看到这个:

<apply template='header'></apply>
Run Code Online (Sandbox Code Playgroud)

haskell heist

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

如何通过HDBC将二进制数据放入postgres?

我有一个Haskell应用程序,作为许多步骤之一,需要在数据库中存储和检索原始二进制blob数据.我并不是完全决定将这些数据存储在普通磁盘文件中,但这确实会导致额外的一系列权限问题,因此我现在想要使用数据库.

我创建了一个包含类型列的表bytea.

我在内存中有一个Lazy Bytestring.

当我这样打电话的时候

run conn "INSERT INTO documents VALUES (?)" [toSql $ rawData mydoc]
Run Code Online (Sandbox Code Playgroud)

postgres对数据有点生气.确切的错误消息是

invalid byte sequence for encoding \"UTF8\": 0xcf72
Run Code Online (Sandbox Code Playgroud)

我也毫无疑问地知道我在数据流中有NUL值.因此,考虑到所有这些,安全地编码数据以进行插入的正确方法是什么?


更新

这是我的表的描述

db=> \d+ documents
                          Table "public.documents"
     Column      |            Type             | Modifiers | Storage  | Description 
-----------------+-----------------------------+-----------+----------+-------------
 id              | character varying(16)       | not null  | extended | 
 importtime      | timestamp without time zone | not null  | plain    | 
 filename        | character varying(255)      | not null  | extended | 
 data            | bytea                       | …
Run Code Online (Sandbox Code Playgroud)

postgresql haskell hdbc

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

如何在Nix环境中使macOS框架可用于clang?

我在macOS 10.13.5上,正在学习对Rust进行编程,并且使用Nix来控制我的开发环境。

某些操作(例如包括jsonwebtoken库或安装 cargo-watch模块)会导致构建需要一个似乎未安装的macOS框架。我收到此错误消息:

  = note: ld: framework not found CoreServices
          clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)

error: aborting due to previous error

error: failed to compile `cargo-watch v6.0.0`, intermediate artifacts can be found at `/var/folders/13/84dj8yr54_1c_pn0s8n7444h0000gn/T/cargo-install.lYPZaEduUBdu`

Caused by:
  Could not compile `cargo-watch`.
Run Code Online (Sandbox Code Playgroud)

这是失败的clang命令的缩写版本:

error: linking with `/nix/store/9j864incgjx7kqggbpisdi3nmssy4qm5-clang-wrapper-5.0.2/bin/cc` failed: exit code: 1
  |
  = note: "/nix/store/9j864incgjx7kqggbpisdi3nmssy4qm5-clang-wrapper-5.0.2/bin/cc" "-m64" "-L" ... "/nix/store/rfp87664xzhl6zv7dx5c1hixasqfxkp4-rustc-1.24.0/lib/rustlib/x86_64-apple-darwin/lib/libcompiler_builtins-ba331b20e371c580.rlib" "-framework" "CoreServices" "-framework" "CoreServices" "-l" "System" "-l" "resolv" "-l" "pthread" …
Run Code Online (Sandbox Code Playgroud)

macos rust rust-cargo nix

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