小编Chr*_*kle的帖子

Haskell Cont monad是如何以及为什么工作的?

这就是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)

你能解释一下这是如何以及为何有效吗?它在做什么?

monads continuations haskell

70
推荐指数
4
解决办法
8172
查看次数

Haskell中的那种"*"究竟是什么?

在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.那是真的吗?我们已经有一些 …

haskell ghc type-kinds

32
推荐指数
3
解决办法
5180
查看次数

为什么我不能使用具有存在量化类型的记录选择器?

使用存在类型时,我们必须使用模式匹配语法来提取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)

haskell record existential-type

28
推荐指数
2
解决办法
2392
查看次数

解释这一块输出素数流的haskell代码

我无法理解这段代码:

let
  sieve (p:xs) = p : sieve (filter (\ x -> x `mod` p /= 0) xs)
in sieve [2 .. ]
Run Code Online (Sandbox Code Playgroud)

有人可以为我分手吗?我知道它有递归,但这就是问题我无法理解这个例子中的递归是如何工作的.

primes haskell lazy-evaluation

19
推荐指数
3
解决办法
3434
查看次数

为什么GHC会产生等式约束错误而不是类型匹配错误?

这个问题开始,我不确定为什么这两个代码片段会产生完全不同的错误:

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)

haskell compiler-errors ghc

9
推荐指数
1
解决办法
135
查看次数

如何在GHCI中加载优化代码?

我正在编写一个依赖于优化的模块.我想在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)

haskell ghc compiler-optimization ghci read-eval-print-loop

9
推荐指数
1
解决办法
1087
查看次数

导出类型构造函数是否有所作为?

假设我有一个内部数据类型,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())这里有区别吗?

haskell

5
推荐指数
1
解决办法
386
查看次数

适用于Visual Studio Express的多设备混合应用程序(预览版)

我尝试安装多设备混合应用程序(预览版).但它表示必须有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

3
推荐指数
1
解决办法
1102
查看次数

使用列表理解进行素数分解

我想.在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]并非所有的主要因素.

haskell prime-factoring

3
推荐指数
1
解决办法
765
查看次数

错误"无法推断(a~b)"是什么意思?

我正在修改以下代码作为任务的一部分:

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)

haskell types

2
推荐指数
1
解决办法
232
查看次数

原始递归函数的指称语义表示

有没有办法在Haskell中表示原始递归函数(PRF)的指称语义?

haskell

0
推荐指数
1
解决办法
267
查看次数