有人可以向我解释功能性镜片吗?谷歌这是一个令人惊讶的困难主题,我没有取得任何进展.我所知道的是,它们提供了类似于OO的获取/设置功能.
虽然我在Haskell示例代码中看到了各种奇怪的东西 - 我从未见过运算符加上过载.它有什么特别之处吗?
假设我有类似Pair的类型,我希望有类似的东西
Pair(2,4) + Pair(1,2) = Pair(3,6)
Run Code Online (Sandbox Code Playgroud)
可以一个人在哈斯克尔做吗?
我只是很好奇,因为我知道Scala可以以一种相当优雅的方式.
我正在开发一个分析Haskell代码的项目.我决定使用GHC来解析源代码并推断类型而不是编写我自己的代码来做到这一点.现在,我正在通过Haddock文档,但它进展缓慢.有谁知道一个很好的教程?
编辑:澄清一下,我不是在寻找像hlint这样的东西.我正在编写自己的工具来分析Haskell代码的运行时特性,所以就像我正在编写一个不同的hlint.我正在寻找的基本上是维基页面GHC作为一个库的扩展.
我试图了解导管和管道之间的差异.与管道不同,管道具有剩余物的概念.什么是剩菜有用?我想看一些剩菜必不可少的例子.
由于管道没有剩余的概念,有没有办法与它们实现类似的行为?
我正在看一下用于流处理的管道3.0包.该教程非常好,非常清楚,除了我无法绕过"zip和merge"部分.
我的目标是结合管道有点像ArrowChoice允许做:
+----------+ +------+ - 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) 我想在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内容,以便它可以工作?
假设我有一个任意模块
module Foo where
foo :: Moo -> Goo
bar :: Car -> Far
baz :: Can -> Haz
Run Code Online (Sandbox Code Playgroud)
在哪里foo
,bar
和baz
,正确实施等
我想将此模块重新生成为自动生成的数据类型和相应的对象:
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 …
我试图理解管道概念的不同实现之间的差异.导管和管道之间的区别之一是它们如何将管道熔合在一起.管道有
(>+>) :: 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和Pipes库实现一个简单的Web服务器.我现在明白管道不可能使用循环或钻石拓扑,但我认为我想要的是.因此我想要的拓扑结构是:
-GET--> handleGET >-> packRequest >-> socketWriteD
|
socketReadS >-> parseRequest >-routeRequest
|
-POST-> handlePOST >-> packRequest >-> socketWriteD
Run Code Online (Sandbox Code Playgroud)
我有HTTPRequest RequestLine Headers Message
和HTTPResponse 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) 我正在编写一个函数,可以在一系列任意符号中进行搜索.我想使它足够通用,以便它可以在列表,Foldable
s以及ByteString
s和Text
s上运行.将其概括Foldable
为简单.但是如何包含ByteString
s和Text
s?当然我可以转换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)