- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Haskell 的新手,想知道如何声明
[ (x !! 0, x !! 1) | x <- mapM (const ['A', 'B', 'C'] ) [1..2], head x < head (tail x) ]
有效。 (我在 StackOverflow 上找到了它。)我知道它输出什么,但我并不真正理解它。
最佳答案
嗯,上面的表达式可能不是 Haskell 所认为的惯用。可能更好的版本是:
[ <b>(x0, x1)</b> | <b>(x0:x1:_)</b> <- mapM (const "ABC") [1..2], <b>x0 < x1</b> ]
这更干净,如果 mapM (const "ABC")
中的列表将返回一个包含少于两个元素的列表(这是不可能的),它不会出错。
可能这里的核心问题是了解如何mapM
作品。表达式 mapM (const "ABC") [1..2]
归结为:
mapM (\_ -> "ABC") [1..2]
由于我们不考虑列表的值,它等同于:
replicateM 2 "ABC"
这replicateM
对于 2
可以重写为(伪 Haskell 语法):
replicateM 2 :: [a] -< [[a]]
replicateM 2 l = do
x0 <- l
x1 <- l
return [x0, x1]
或者如果我们将其脱糖:
replicateM 2 l = l >>= \x0 -> l >>= \x1 -> return [x0, x1]
对于列表,Monad
的实例实现为:
instance Monad [] where
return x = [x]
(>>=) = flip concatMap
所以这意味着对于一个列表这个 replicateM 2
, 实现为:
replicateM 2 l :: [a] -> [[a]]
replicateM 2 l = concatMap (\x0 -> concatMap (\x1 -> [[x0, x1]]) l) l
或更简单:
replicateM 2 l :: [a] -> [[a]]
replicateM 2 l = concatMap (\x0 -> map (\x1 -> [x0, x1]) l) l
因此,我们对列表中的两项进行了所有可能的组合。因此,这意味着:
Prelude Control.Monad> replicateM 2 "ABC"
["AA","AB","AC","BA","BB","BC","CA","CB","CC"]
然后我们在列表推导中使用它,对于每个有两个元素的子列表,我们检查第一个元素是否为 x0
小于列表推导 (x0 < x1
) 中带有过滤器部分 的第二个元素。如果是这种情况,我们将这些元素作为 2 元组生成。
它因此为 "ABC"
中的每两个项目创建二元组,如果第一个元素(严格)小于第二个元素。
然而,这里我们做了一些“太多的工作”:超过一半的元素将被拒绝。我们可以通过使用 tails :: [a] -> [[a]]
来优化它:
import Data.List(tails)
[(x0, x1) | (x0:<b>xs</b>) <- <b>tails "ABC"</b>, x1 <- <b>xs</b> ]
产生相同的值:
Prelude Control.Monad Data.List> [(x0, x1) | (x0:xs) <- tails "ABC", x1 <- xs ]
[('A','B'),('A','C'),('B','C')]
关于haskell - `[ (x !! 0, x !! 1) | x <- mapM (const [' A', 'B' , 'C' ] ) [1..2], head x < head (tail x) ]` 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61590437/
假设,我在使用 IO 时得到了大量的项目列表: as IO b转至 as : as (a -> m b) -> [a] -> m [b] ,这就是我在类型匹配方面所需要的。但它会在内存中构建所有链
给定返回 m (Maybe a) 的操作列表我正在尝试返回 m (Maybe [a])如果任何单个结果是 Nothing整个结果是 Nothing . m包含 StateT我想避免在第一个 Nothi
考虑以下简单的 IO 函数: req :: IO [Integer] req = do print "x" return [1,2,3] 实际上,这可能是一个 http 请求,它在解析结果后返
在我最近的 work与 Gibbs sampling ,我一直在充分利用 RVar 在我看来,它为随机数生成提供了一个近乎理想的接口(interface)。遗憾的是,由于无法在 map 中使用 mon
考虑以下 Haskell 语句: mapM print ["1", "2", "3"] 实际上,这会按顺序打印“1”、“2”和“3”。 问题:你怎么知道mapM会先打印“1”,然后打印“2”,最后打印
据我了解forM与 mapM 相同,只有论点被颠倒。 这是否意味着我可以替换每个 forM与 mapM反之,如果我颠倒我给他们的论点? 最佳答案 的确。 forM是 literally只是... fo
更新:好的,这个问题可能变得非常简单。 q Rand g (Double, [Double]) f = do b Rand g a -> Rand g a splitRandom code
在交互模式下使用 mapM 时:调用 mapM putStrLn ["random","Text"]输出是 random text [(),()] 然而,当我从脚本调用相同的函数然后运行脚本时: ma
Prelude> mapM putStrLn ["a", "b"] a b [(),()] Prelude> mapM_ putStrLn ["a", "b"] a b 为什么第一个版本显示第三行而第
考虑以下示例: safeMapM f xs = safeMapM' xs [] where safeMapM' [] acc = return $ reverse acc
在交互模式下使用 mapM 时:调用 mapM putStrLn ["random","Text"]输出是 random text [(),()] 然而,当我从脚本调用相同的函数然后运行脚本时: ma
我正在查看 Real World Haskell 的 I/O 章节。书中另外 7 章没有讨论 Monad。也就是说,我对 I/O 的理解充其量是不完整的。 现在我正在尝试理解mapM函数。据我了解,该
这是一种奇怪的行为,即使对 Haskell 来说也是如此。看下面的代码段: import System.Directory import System.FilePath -- This spins i
我在 Haskell 中编写了一个非常简单的两遍汇编程序,我遇到了一个我还没有经验来解决的场景。我认为解决方案很可能涉及单子(monad)变压器,我不太了解。 汇编器将汇编代码解析为 Statemen
我的应用程序需要在运行时打开多个资源。我通过映射 openFile 来实现这一点一次在应用程序的开始。 let filePaths = ["/dev/ttyUSB0", "/dev/ttyUSB1",
我最近需要以下功能。这个想法是拉上原来的xs值以及 mapM f xs值。 zipMapM f xs = fmap (zip xs) (mapM f xs) 把它通过pointfree,我得到了什么,
由于我一直在寻找优化我一直在制作的密码破解程序的方法,我遇到了一个列表中所有可能的字符组合的更短的实现,它使用了这个函数: mapM (const xs) [1..n] 哪里xs可能是可用的字符,和
cats 是否提供了与 Haskell 中的 mapM 等效的功能?它应该看起来像: def mapM[A, B, F[_], Col[_]] (col: Col[A])(f: A => F[
我正在想办法结合traverseOf与 >>=以这样的方式允许以下内容。 TLDR;普通 Haskell 中的一个简单示例如下所示,但使用数据结构深处的透镜。 λ> fmap concat $ map
ByteString 有标准(纯) map 函数和 Text : map :: (Word8 -> Word8) -> ByteString -> ByteString map :: (Char ->
我是一名优秀的程序员,十分优秀!