小编Eva*_*ian的帖子

在某些向量操作中没有懒惰

此代码试图热切地评估[1..]导致无限循环的原因.

import qualified Data.Vector as V

infiniteLoop = V.zipWith (+) (V.fromList [1..4]) (V.fromList [1..])
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

haskell

6
推荐指数
2
解决办法
306
查看次数

fmap putStrLn getLine不执行IO

实际上,标题就是这么说的.我无法理解为什么以下代码实际上不打印"Hello World"而不是什么>>=.

main = fmap putStrLn getLine
Run Code Online (Sandbox Code Playgroud)

目前,这是我的推理,请检查它是否有任何谬误.

如果我们比较fmap>>=

(>>=) :: Monad m => m a -> (a -> m b) -> m b
fmap :: Functor f => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

在绑定,上下文或IO术语"世界"中,第一个m和第二个m除了类型之外完全不同.(a -> m b)基本上重新创造了一个新的"世界".在Functor中不是这样,上下文f是相同的,因此副作用是不可能的.

现在,如果确实如此,为什么当我们尝试对fmap现有的IO Monad进行有效的IO 时,编译器不会发出警告?

haskell

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

单态限制,ghci和let表达

这个表达式不正确.

f = show
Run Code Online (Sandbox Code Playgroud)

但是,在ghci这是合法的

let f = show
Run Code Online (Sandbox Code Playgroud)

而且,它的类型改为

() -> String
Run Code Online (Sandbox Code Playgroud)

这种现象有什么解释吗?

haskell

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

点免费monadic表达

考虑这个表达式(取自Real World Haskell第8章,我试图简化)

isElfFile :: FilePath -> IO Bool
isElfFile path = return . hasElfMagic =<< L.readFile path
Run Code Online (Sandbox Code Playgroud)

如何制作此功能的无点版本?我尝试使用其他绑定操作>>=,解除hasElfMagic,但似乎没有工作.

haskell

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

使用有序的Int压缩一个Set

有没有一种方法,以zip一个Set在Haskell,而无需将其转换为List第一?

我想要一个从给定的边缘数据创建一组顶点的函数.顶点基本上是一对索引及其数据.

data Vertex a = Vertex { idx::Int, cont::a }

toVertexSet :: S.Set String -> S.Set (Vertex String)
toVertexSet = undefined

toStringSet:: [(String, String, Int)] -> S.Set String
toStringSet = foldl insertToSet S.empty where
    insertToSet set (vfrom, vto, _) =
        case (S.member vfrom set, S.member vto set) of
            (True, True) -> set
            (True, False) -> S.insert vto set
            (False, True) -> S.insert vfrom set 
            (False, False) -> S.insert vto (S.insert vfrom set)
Run Code Online (Sandbox Code Playgroud)

基本上我想 …

haskell

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

过滤申请人

我正在做NICTA Haskell课程并坚持到最后一部分Applicative,这是我的进步.

基本上,我们将使用在Applicative上下文中生成List的谓词来过滤List.

filtering :: Applicative f => (a -> f Bool) -> List a -> f (List a)
filtering _ Nil = pure Nil
filtering f (x :. rest) = 
        let whole = lift2 (:.) (pure x) (filtering f rest) in
        lift2 filter (const <$> f x) whole
Run Code Online (Sandbox Code Playgroud)

所以whole这里是完整的未经过滤的列表,所以我解除了filter,并且添加的const (const <$> f x)是为了满足中的(a -> Bool)要求filter.

一切都很好,它编译成功,但它失败了一个测试用例,所以这里肯定是错的.

例如,filtering (Id . even) [4,5,6]只返回Id [4]而不是Id [4,6] …

haskell

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

如何将haskell unicode字符串解析为unicode字符

String在Haskell中代表一个unicode字符,比如说"\\x00a0",我想把它转换成Char(在这种情况下为'\ x00a0').

我最后一次失败的尝试是将read它作为Int,然后Data.Char.chr用来转换回Char.它适用于八进制文字,"\\xxx"但不适用于Unicode.

有人可以给我指点吗?

haskell

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

无法使用GUI Macvim添加提交消息

当我用git commitmvim作为编辑,平常的COMMIT_MSG文件在新的MacVim窗口打开了,但是当我写并退出消息,混帐忽略提交信息.

如果我使用终端vim,这个问题不会发生,所以我认为我的vim配置没有问题.

我该怎么办?我用iTerm跑步zsh

git vim macvim

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

使用StateT进行解析的正确方法

考虑以下错误的解析器编写为StateT.

type Parser a = StateT String Maybe a -- Maybe is chosen arbitrarily here.

oneDigit :: Parser Int
oneDigit = do
        (x : _) <- get
        return (read x :: Int)
Run Code Online (Sandbox Code Playgroud)

它抛出以下错误:

No instance for (MonadState [String] (StateT String Maybe))
Run Code Online (Sandbox Code Playgroud)

但是,当我改变时,这并没有发生oneChar :: Parser Char.

我的结论是,你只能定义一个Parser a你的国家m a

现在我的问题是,我如何放松这种耦合要求?

haskell

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

标签 统计

haskell ×8

git ×1

macvim ×1

vim ×1