如果这是一个愚蠢的问题,我刚刚开始学习对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) 在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) 我正在研究需要与服务器通信的网络流客户端.服务器以字节为单位对响应进行编码,例如"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编码器都是懒惰的.我是泛型编程的新手,所以有人可以告诉我是否有可以完成这项工作的软件包?