使用时间库(时间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?
在模块中Text.ParserCombinators.ReadP,munch(和munch1)文档说:
解析满足谓词的第一个零个或多个字符.总是成功,一次消耗了所有的角色因此不一样
(many (satisfy p)).
他们有什么不同?
我有一个Map,其中键是一个新的Text类型.我想自动(尽可能)为此Map 派生ToJSON和FromJSON.埃宋已经为地图文字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) 我的目标是创建一个在ReaderT WriterT堆栈或RWS堆栈中使用列表monad的函数.更一般地说,如何在mtl类型类中使用列表monad,例如MonadReader,MonadWriter?
我为什么要这样做?这个问题是在Beginning Haskell中的一个练习.它要求我"来自MonadReader和MonadWriter包装用底名单单子使用功能要检查功能一般情况下,使用两种不同的单子到[测试]所请求的功能:ReaderT r (WriterT w []) a与RWST 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, …
我想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) 如何使用Reader/ ReaderT来ask获取列表类型,例如[(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)