小编Dav*_*rak的帖子

功能性镜片

有人可以向我解释功能性镜片吗?谷歌这是一个令人惊讶的困难主题,我没有取得任何进展.我所知道的是,它们提供了类似于OO的获取/设置功能.

haskell functional-programming lenses

78
推荐指数
2
解决办法
1万
查看次数

你可以在haskell超载吗?

虽然我在Haskell示例代码中看到了各种奇怪的东西 - 我从未见过运算符加上过载.它有什么特别之处吗?

假设我有类似Pair的类型,我希望有类似的东西

 Pair(2,4) + Pair(1,2) = Pair(3,6)
Run Code Online (Sandbox Code Playgroud)

可以一个人在哈斯克尔做吗?

我只是很好奇,因为我知道Scala可以以一种相当优雅的方式.

haskell

45
推荐指数
5
解决办法
2万
查看次数

需要一个使用GHC解析和检查Haskell的教程

我正在开发一个分析Haskell代码的项目.我决定使用GHC来解析源代码并推断类型而不是编写我自己的代码来做到这一点.现在,我正在通过Haddock文档,但它进展缓慢.有谁知道一个很好的教程?

编辑:澄清一下,我不是在寻找像hlint这样的东西.我正在编写自己的工具来分析Haskell代码的运行时特性,所以就像我正在编写一个不同的hlint.我正在寻找的基本上是维基页面GHC作为一个库的扩展.

haskell ghc ghc-api

25
推荐指数
2
解决办法
1693
查看次数

导管残羹剩饭的好处是什么?

我试图了解导管管道之间的差异.与管道不同,管道具有剩余物的概念.什么是剩菜有用?我想看一些剩菜必不可少的例子.

由于管道没有剩余的概念,有没有办法与它们实现类似的行为?

haskell conduit haskell-pipes

14
推荐指数
2
解决办法
1013
查看次数

管道3.0:非线性拓扑

我正在看一下用于流处理的管道3.0包.该教程非常好,非常清楚,除了我无法绕过"zip和merge"部分.

我的目标是结合管道有点像ArrowChoice允许做:

  • 我有一个独特的生产者Aither aa
  • 我想将第一个管道应用于Left值,将另一个管道应用于Right值
  • 然后我想合并结果,并继续管道


+----------+                   +------+ - filterLeft ->  pipe1 -> +------------+ 
| producer | - (Either a a) -> | fork |                           | mergeD (?) |
+----------+                   +------+ - filterRight -> pipe2 -> +------------+

Run Code Online (Sandbox Code Playgroud)

fork在教程中定义:

fork () = 
    runIdentityP . hoist (runIdentityP . hoist runIdentityP) $ forever $ do
        a <- request ()
        lift $ respond a
        lift $ lift $ respond a

oddOrEven x = if odd x then Left x else …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-pipes

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

在Windows上部署应用程序的GHC API的简单方法

我想在Windows上部署需要访问GHC API的应用程序.使用Wiki中的第一个简单示例:

http://www.haskell.org/haskellwiki/GHC/As_a_library

导致以下错误(在具有haskell平台的一台机器上编译并在另一个干净的Windows安装上执行):test.exe:在C:\ haskell\lib\package.conf.d中找不到包数据库

我想将我的应用程序部署为一个简单的zip文件,而不是要求用户安装任何东西.是否有一种简单的方法可以在该zip文件中包含所需的GHC内容,以便它可以工作?

windows deployment haskell ghc-api

11
推荐指数
1
解决办法
412
查看次数

将模块恢复为记录

假设我有一个任意模块

module Foo where
foo :: Moo -> Goo
bar :: Car -> Far
baz :: Can -> Haz
Run Code Online (Sandbox Code Playgroud)

在哪里foo,barbaz,正确实施等

我想将此模块重新生成为自动生成的数据类型和相应的对象:

import Foo (Moo, Goo, Car, Far, Can, Haz)
import qualified Foo

data FooModule = Foo
  { foo :: Moo -> Goo
  , bar :: Car -> Far
  , baz :: Can -> Haz
  }

_Foo_ = Foo
  { foo = Foo.foo
  , bar = Foo.bar
  , baz = Foo.baz
  }
Run Code Online (Sandbox Code Playgroud)

名称必须与原始模块完全相同.

我可以手动执行此操作,但这非常繁琐,所以我想编写一些代码来为我执行此任务.

我不确定如何处理这样的任务.Template …

haskell module ghc-api template-haskell

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

导管上游类型参数的真正好处是什么?

我试图理解管道概念的不同实现之间的差异.导管管道之间的区别之一是它们如何将管道熔合在一起.管道

(>+>) :: Monad m
      => Pipe l a b r0 m r1 -> Pipe Void b c r1 m r2 -> Pipe l a c r0 m r2
Run Code Online (Sandbox Code Playgroud)

(>->) :: (Monad m, Proxy p)
      => (b' -> p a' a b' b m r) -> (c' -> p b' b c' c m r) -> c' -> p a' a c' c m r
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,使用管道,当两个管道的任何管道停止时,返回其结果而停止另一个.使用导管,如果左侧管道完成,其结果将向下游发送到右侧管道.

我想知道, …

haskell conduit haskell-pipes

10
推荐指数
2
解决办法
344
查看次数

Haskell管道和分支

问题

我正在尝试使用Haskell和Pipes库实现一个简单的Web服务器.我现在明白管道不可能使用循环或钻石拓扑,但我认为我想要的是.因此我想要的拓扑结构是:

                                 -GET--> handleGET >-> packRequest >-> socketWriteD
                                 |
socketReadS >-> parseRequest >-routeRequest
                                 |
                                 -POST-> handlePOST >-> packRequest >-> socketWriteD
Run Code Online (Sandbox Code Playgroud)

我有HTTPRequest RequestLine Headers MessageHTTPResponse StatusLine Headers Message链中使用的类型.socketReadS从套接字中获取字节并将它们转发给它parseRequest,它使用Attoparsec将字节解析为一个HTTPRequest对象.然后,我希望管道分支至少两次,可能更多,具体取决于我实现的HTTP方法数量.每个handle<method>函数都应该接收HTTPRequest来自上游和前向HTTPResponse对象的对象packRequest,这些对象只是将HTTPResponse对象打包成一个ByteString随时可以发送的对象socketWriteS.

如果我让GHC推断出类型,那么下面的代码可以检查routeRequest'''(我的某种方式似乎有些偏差).但是之后似乎没有任何事情在执行parseRequest.任何人都可以帮我找出原因吗?

我有以下代码routeRequest应该处理分支.

routeRequest''' ::
    (Monad m, Proxy p1, Proxy p2, Proxy p3)
    => () -> Consumer p1 HTTPRequest (Pipe p2 HTTPRequest HTTPRequest (Pipe p3 …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-pipes

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

使单个函数在列表,ByteStrings和文本(以及可能的其他类似表示)上工作

我正在编写一个函数,可以在一系列任意符号中进行搜索.我想使它足够通用,以便它可以在列表,Foldables以及ByteStrings和Texts上运行.将其概括Foldable为简单.但是如何包含ByteStrings和Texts?当然我可以转换ByteString成一个列表,然后调用我的功能,但我会失去所有的优势ByteString.

举一个具体的例子,假设我们想要制作直方图函数:

import Control.Monad.State
import qualified Data.Foldable as F
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import Data.Word
import qualified Data.ByteString as B
import qualified Data.Text as T

type Histogram a = Map a Int

empty :: (Ord a) => Histogram a
empty = Map.empty

histogramStep :: (Ord a) => a -> Histogram a -> Histogram a
histogramStep k = Map.insertWith (+) k …
Run Code Online (Sandbox Code Playgroud)

text haskell fold bytestring lenses

9
推荐指数
3
解决办法
592
查看次数