小编Dan*_*l K的帖子

如何将DiffTime转换为NominalDiffTime?

使用时间库(时间1.5),我有一个常数,例如1秒.我没有看到创建NominalDiffTime的方法,所以我创建了一个DiffTime:

twoSeconds = secondsToDiffTime 2
Run Code Online (Sandbox Code Playgroud)

现在我想与UTCTime进行交互:

now <- getCurrentTime
let twoSecondsAgo = addUTCTime (-twoSeconds) now
Run Code Online (Sandbox Code Playgroud)

其中当然不进行类型检查,因为addUTCTime期望参数1中的NominalDiffTime并且我已经传递了DiffTime.如何在两种类型之间进行转换?或者我如何创建2秒的NominalDiffTime?

haskell

12
推荐指数
2
解决办法
2183
查看次数

蒙克与许多人之间的差异(满足p)?

在模块中Text.ParserCombinators.ReadP,munch(和munch1)文档说:

解析满足谓词的第一个零个或多个字符.总是成功,一次消耗了所有的角色因此不一样(many (satisfy p)).

他们有什么不同?

parsing haskell

8
推荐指数
1
解决办法
446
查看次数

自动派生ToJSON(Map NewtypeOfText v)

我有一个Map,其中键是一个新的Text类型.我想自动(尽可能)为此Map 派生ToJSONFromJSON.埃宋已经为地图文字v实现的toJSON和FromJSON实例.

我的详细代码有效:

{-# LANGUAGE DeriveGeneric    #-}

module Test where

import           ClassyPrelude

import           Data.Aeson                  
import           GHC.Generics                (Generic)

import qualified Data.Map                    as M

newtype MyText = MyText {unMyText::Text} deriving (Eq, Ord)

data Bar = Bar deriving (Generic)
instance ToJSON Bar
instance FromJSON Bar

data Foo = Foo (Map MyText Bar)

instance ToJSON Foo where
  toJSON (Foo x) = toJSON mp
    where mp = M.fromList . map (\(x,y) -> (unMyText x,y)) . M.toList $ …
Run Code Online (Sandbox Code Playgroud)

haskell aeson

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

在monad变换器类型类中使用list monad?

我的目标是创建一个在ReaderT WriterT堆栈或RWS堆栈中使用列表monad的函数.更一般地说,如何在mtl类型类中使用列表monad,例如MonadReader,MonadWriter?

我为什么要这样做?这个问题是在Beginning Haskell中的一个练习.它要求我"来自MonadReader和MonadWriter包装用底名单单子使用功能要检查功能一般情况下,使用两种不同的单子到[测试]所请求的功能:ReaderT r (WriterT w []) aRWST r w s m a"所以这本书暗示这是可能的.

我无法弄清楚如何"告诉"编译器使用列表monad.如果我使用ask >>= lift或者ask >>= lift . lift我可以使2级堆栈(RWST [])或3级堆栈(ReaderT WriterT [])工作,但不能同时工作.

我的问题的焦点:

pathImplicitStack' start end | start == end = tell [end]
pathImplicitStack' start end =
  do  (s0, e0) <- ask >>= lift
      guard $ s0 == start
      tell [start]
      pathImplicitStack' e0 end
Run Code Online (Sandbox Code Playgroud)

另外,我想知道如何键入该功能.到目前为止,我最好的尝试看起来像pathImplicitStack' :: (MonadReader [(Int, Int)] m, MonadWriter [Int] m, …

haskell monad-transformers

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

如何导入这个复杂的数据构造函数,仅此而已?

我想Vec3D从Vec包中导入数据构造函数Data.Vec.Packed.显然,我可以

import Data.Vec.Packed
Run Code Online (Sandbox Code Playgroud)

并且完成了事情,但这不是我想要做的事情,因为这会为目前的范围增加额外的东西.

Vec3D数据构造被宣布像这样的Data.Vec.Packed模块:

instance PackedVec (Vec3 Double) where
  data Packed (Vec3 Double) = Vec3D {-#UNPACK#-} !Double {-#UNPACK#-} !Double {-#UNPACK#-} !Double
...
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它没有编译:

import Data.Vec.Packed (Packed (Vec3 Double)(..))
Run Code Online (Sandbox Code Playgroud)

如何只导入Vec3D数据构造函数?

仅供参考,如果您在ghci中导入模块:

* Data.Vec> :info  Vec3D
data instance Packed (Vec3 Double)
  = Vec3D {-# UNPACK #-}Double
          {-# UNPACK #-}Double
          {-# UNPACK #-}Double
    -- Defined in ‘Data.Vec.Packed’

type Vec3D = Packed (Vec3 Double)   -- Defined in ‘Data.Vec.Packed’
Run Code Online (Sandbox Code Playgroud)

haskell

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

如何在ReaderT中使用list monad?

如何使用Reader/ ReaderTask获取列表类型,例如[(Int, Int)]然后在列表monad中执行计算(属于asked 的类型)?

我的破解代码如下,为了清楚起见缩短了:

attempt :: Int -> Int -> ReaderT [(Int,Int)] [] [[Int]]
attempt start end =
  do  (s0, e0) <- ask
      return [0]
Run Code Online (Sandbox Code Playgroud)

为了让您了解我正在尝试做什么,这里是相同的功能,使用列表monad而不是Reader:

paths :: [(Int, Int)] -> Int -> Int -> [[Int]]
paths edges start end =
  if start == end
    then return [end]
    else do   (s0, e0) <- edges
              guard $ s0 == start
              subpath <- paths edges e0 end
              return $ s0 : subpath …
Run Code Online (Sandbox Code Playgroud)

haskell monad-transformers

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

标签 统计

haskell ×6

monad-transformers ×2

aeson ×1

parsing ×1