这是一个一般的问题,与任何一段代码无关。
假设您有一个类型的T a,它可以给出一个Monad实例。由于每个monad都是通过赋值Applicative和(<*>) = ap来实现的,然后每个应用程序都是通过fmap f x = pure f <*> x定义的Functor,所以最好先定义Monad实例,然后再给出Applicative和Functor的T实例。
我觉得有点不对劲。如果我做的是数学而不是编程,我会认为我的对象是函子,然后继续添加限制,直到我也证明了它是一个单子。我知道Haskell只是受到范畴理论的启发,很明显,在构造证明时使用的技术并不是编写有用程序时使
我想在Haskell中创建我自己的单曲,让Haskell像其他在monad中构建的一样对待它。例如,下面的代码用于创建一个monad,它在每次调用全局状态变量时更新某个全局状态变量,以及一个用于计算调用quot函数次数的评估器:
-- define the monad type
type M a = State -> (a, State)
type State = Int
-- define the return and bind operators for this monad
return a x = (a, x)
(>>=) :: M a -> (a ->
我目前正在使用到HDF5 C库的Haskell绑定。与许多C库一样,这个库在其函数调用中使用了许多指针。
通常用于分配和释放C资源的“最佳实践”函数遵循,如alloca、withArray等。在使用它们时,我经常输入几个嵌套括号。例如,下面是HDF5绑定的一个小片段:
selectHyperslab rID dName = withDataset rID dName $ \dID -> do
v <- withDataspace 10 $ \dstDS -> do
srcDS <- c'H5Dget_space dID
dat <- a