小编use*_*201的帖子

如何使用replicateM?

如果这是一个愚蠢的问题,我刚刚开始学习对Haskell进行编码,如此道歉。我正在尝试通过使用[] monad重做8个皇后问题。这是代码,

import Control.Monad
addqueen :: [Int] -> [[Int]]
addqueen xs = 
[x:xs|x<-[1,2..8], not $ x `elem` xs || (any (\(index,q) -> abs (x-q) ==index) $ zip [1..] xs)]
Run Code Online (Sandbox Code Playgroud)

当我尝试

[[]]>>= replicateM 8 addqueen
Run Code Online (Sandbox Code Playgroud)

它不起作用,但是会产生以下错误:

Couldn't match expected type `t0 -> t1' with actual type `[[a0]]'
The first argument of ($) takes one argument,
but its type `[[a0]]' has none
In the expression: [[]] >>= replicateM 8 $ addqueen
In an equation for `it': it = [[]] >>= replicateM 8 …
Run Code Online (Sandbox Code Playgroud)

haskell

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

为什么导管和管道不能具有Arrow实例?

在reddit上有一个存档的线程,该线程表示管道基本上不能是箭头b / c箭头需要同步。该线程链接在这里https://www.reddit.com/r/haskell/comments/rq1q5/conduitssinks_and_refactoring_arrows/

我看不到“同步”出现的地方,因为这不是箭头定义的一部分。另外,我在github https://github.com/cmahon/interactive-brokers上偶然发现了这个项目,该项目将管道明确地视为箭头。为了方便起见,我在此处粘贴实例def。我在这里想念什么?

-- The code in this module was provided by Gabriel Gonzalez

{-# LANGUAGE RankNTypes #-}

module Pipes.Edge where

import           Control.Arrow
import           Control.Category (Category((.), id))
import           Control.Monad ((>=>))
import           Control.Monad.Trans.State.Strict (get, put)
import           Pipes
import           Pipes.Core (request, respond, (\>\), (/>/), push, (>~>))
import           Pipes.Internal (unsafeHoist)
import           Pipes.Lift (evalStateP)
import           Prelude hiding ((.), id)

newtype Edge m r a b = Edge { unEdge :: a -> Pipe a b m r }

instance (Monad …
Run Code Online (Sandbox Code Playgroud)

haskell arrows conduit haskell-pipes

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

(通常)从自定义数据类型构建解析器?

我正在研究需要与服务器通信的网络流客户端.服务器以字节为单位对响应进行编码,例如"1\NULJohn\NULTeddy\NUL501\NUL",其中'\ NUL'是分隔符.上述响应转换为"这是类型1的消息(由服务器硬编码),它告诉客户端用户的ID是什么(这里,"John Teddy"的用户ID是"501").

天真地,我定义了一个自定义数据类型

data User
  { firstName :: String
  , lastName :: String
  , id :: Int
  }
Run Code Online (Sandbox Code Playgroud)

和这种数据类型的解析器

parseID :: Parser User
parseID = ...
Run Code Online (Sandbox Code Playgroud)

然后,在解析器成功匹配这样的响应之后,只需编写一个处理程序来完成某项工作(例如,写入数据库).这非常简单.

但是,服务器有几乎100种类型的不同响应,客户端需要解析.我怀疑必须有更优雅的方式来完成这项工作,而不是像这样编写100个几乎相同的解析器,因为毕竟所有haksell编码器都是懒惰的.我是泛型编程的新手,所以有人可以告诉我是否有可以完成这项工作的软件包?

haskell

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

标签 统计

haskell ×3

arrows ×1

conduit ×1

haskell-pipes ×1