这就是Cont monad的定义方式:
newtype Cont r a = Cont { runCont :: (a -> r) -> r }
instance Monad (Cont r) where
return a = Cont ($ a)
m >>= k = Cont $ \c -> runCont m $ \a -> runCont (k a) c
Run Code Online (Sandbox Code Playgroud)
你能解释一下这是如何以及为何有效吗?它在做什么?
在Haskell,(值电平)的表达式被分类成类型,其可与记谱::如下所示:3 :: Int,"Hello" :: String,(+ 1) :: Num a => a -> a.类似地,类型被分类为种类.在GHCI,可以检查的种类使用命令一个类型的表达式:kind或:k:
> :k Int
Int :: *
> :k Maybe
Maybe :: * -> *
> :k Either
Either :: * -> * -> *
> :k Num
Num :: * -> Constraint
> :k Monad
Monad :: (* -> *) -> Constraint
Run Code Online (Sandbox Code Playgroud)
浮动的定义*是"具体类型"或"值"或"运行时值".例如,参见Learn You A Haskell.那是真的吗?我们已经有一些 …
使用存在类型时,我们必须使用模式匹配语法来提取foralled值.我们不能将普通记录选择器用作函数.GHC报告错误并建议使用与以下定义的模式匹配yALL:
{-# LANGUAGE ExistentialQuantification #-}
data ALL = forall a. Show a => ALL { theA :: a }
-- data ok
xALL :: ALL -> String
xALL (ALL a) = show a
-- pattern matching ok
-- ABOVE: heaven
-- BELOW: hell
yALL :: ALL -> String
yALL all = show $ theA all
-- record selector failed
Run Code Online (Sandbox Code Playgroud)
forall.hs:11:19:
Cannot use record selector `theA' as a function due to escaped type variables
Probable fix: use …Run Code Online (Sandbox Code Playgroud) 我无法理解这段代码:
let
sieve (p:xs) = p : sieve (filter (\ x -> x `mod` p /= 0) xs)
in sieve [2 .. ]
Run Code Online (Sandbox Code Playgroud)
有人可以为我分手吗?我知道它有递归,但这就是问题我无法理解这个例子中的递归是如何工作的.
从这个问题开始,我不确定为什么这两个代码片段会产生完全不同的错误:
f :: a -> b
f x = x
-- Couldn't match expected type `b' with actual type `a'
-- In the expression: x
g :: Monad m => a -> m b
g x = return x
-- Could not deduce (a ~ b) from the context (Monad m)
-- In the first argument of `return', namely `x'.
Run Code Online (Sandbox Code Playgroud)
引起这种行为的规则是什么?
对于熟悉标准Haskell的人来说,它的可读性不高; 等式约束(a ~ b)需要语言扩展.
请注意,正如chi指出的那样,仅仅存在约束会触发约束错误:
class C a
h :: C a => a -> …Run Code Online (Sandbox Code Playgroud) 我正在编写一个依赖于优化的模块.我想在ghci中测试这个模块.但是在--interactive模式下启动ghc会自动禁用优化; 如果我编译模块-O然后尝试在交互式会话中ghc加载它,坚持在解释模式下加载它.
对于区分优化和未优化模块的简单测试用例,isOptimized下面评估为True优化,但False优化关闭:
isOptimized :: Bool
isOptimized = g
g :: Bool
g = False
{-# NOINLINE g #-}
{-# RULES "g/True" g = True #-}
Run Code Online (Sandbox Code Playgroud) 假设我有一个内部数据类型,T a用于导出函数的签名:
module A (f, g) where
newtype T a = MkT { unT :: (Int, a) }
deriving (Functor, Show, Read) -- for internal use
f :: a -> IO (T a)
f a = fmap (\i -> T (i, a)) randomIO
g :: T a -> a
g = snd . unT
Run Code Online (Sandbox Code Playgroud)
不导出类型构造函数有T什么影响?它是否会阻止消费者干涉类型的值T a?换句话说,出口清单(f, g)和(f, g, T())这里有区别吗?
我尝试安装多设备混合应用程序(预览版).但它表示必须有VS 2013 Update 2.但我有VS 2013 Update 2(适用于Windows,适用于Windows,适用于Windows Phone和Web).多设备混合应用程序(预览版)不适用于VS 2013的Express版本吗?
visual-studio-express visual-studio-2013 visual-studio-cordova
我想.在Haskell中仅使用列表推导方法和/或(函数组合运算符)找到给定数字的所有素因子.我特别想避免递归解决方案.
例如,pfactors 120必须产生[2,2,2,3,5]输出.
我试过了:
pfactors n = [p | p <- [2..n], n `mod` p == 0, [d | d <- [1..p], p `mod` d == 0] == [1,p]]
Run Code Online (Sandbox Code Playgroud)
但是当我打电话时pfactors 120,结果[2,3,5]并非所有的主要因素.
我正在修改以下代码作为任务的一部分:
rand :: Random a => State StdGen a
rand = do
gen <- get
let (x, gen') = random gen
put gen'
return x
Run Code Online (Sandbox Code Playgroud)
我被要求编写一个函数randR来完成与函数相同的任务,rand但允许指定范围.所需的类型是Random a => (a, a) -> State StdGen a.我写了以下代码:
randR :: Random a => (a, a) -> State StdGen b
randR (lo, hi) = do
gen <- get
let (x, gen') = randomR (lo, hi) gen
put gen'
return x
Run Code Online (Sandbox Code Playgroud)
这看起来正确; 它几乎就像模型一样.但是我收到以下错误:
Could not deduce (a ~ b)
from …Run Code Online (Sandbox Code Playgroud)