此代码试图热切地评估[1..]导致无限循环的原因.
import qualified Data.Vector as V
infiniteLoop = V.zipWith (+) (V.fromList [1..4]) (V.fromList [1..])
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
实际上,标题就是这么说的.我无法理解为什么以下代码实际上不打印"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 时,编译器不会发出警告?
这个表达式不正确.
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)
这种现象有什么解释吗?
考虑这个表达式(取自Real World Haskell第8章,我试图简化)
isElfFile :: FilePath -> IO Bool
isElfFile path = return . hasElfMagic =<< L.readFile path
Run Code Online (Sandbox Code Playgroud)
如何制作此功能的无点版本?我尝试使用其他绑定操作>>=,解除hasElfMagic,但似乎没有工作.
有没有一种方法,以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)
基本上我想 …
我正在做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] …
我String在Haskell中代表一个unicode字符,比如说"\\x00a0",我想把它转换成Char(在这种情况下为'\ x00a0').
我最后一次失败的尝试是将read它作为Int,然后Data.Char.chr用来转换回Char.它适用于八进制文字,"\\xxx"但不适用于Unicode.
有人可以给我指点吗?
当我用git commit用mvim作为编辑,平常的COMMIT_MSG文件在新的MacVim窗口打开了,但是当我写并退出消息,混帐忽略提交信息.
如果我使用终端vim,这个问题不会发生,所以我认为我的vim配置没有问题.
我该怎么办?我用iTerm跑步zsh
考虑以下错误的解析器编写为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
现在我的问题是,我如何放松这种耦合要求?