我知道fold-left会产生左倾的树木,右倾的树木产生右倾的树木,但是当我伸手去拿折叠时,我有时会发现自己陷入了引发头痛的想法,试图确定哪种折叠是合适的.我通常最终会解决整个问题并逐步执行fold函数,因为它适用于我的问题.
所以我想知道的是:
Scala by Example(PDF)中有一个示例,它使用折叠编写一个名为flatten的函数,该函数将元素列表列表连接成一个列表.在这种情况下,右侧折叠是正确的选择(考虑到列表连接的方式),但我必须考虑一下才能得出结论.
由于折叠是(功能)编程中的常见操作,因此我希望能够快速,自信地做出这些决策.所以...任何提示?
好吧,这可能会出现在前奏中,但是:有没有标准的库函数来查找列表中的唯一元素?我的(重新)实施,澄清,是:
has :: (Eq a) => [a] -> a -> Bool
has [] _ = False
has (x:xs) a
| x == a = True
| otherwise = has xs a
unique :: (Eq a) => [a] -> [a]
unique [] = []
unique (x:xs)
| has xs x = unique xs
| otherwise = x : unique xs
Run Code Online (Sandbox Code Playgroud) 在整个网络上,我感觉为编译器编写C后端不再是一个好主意了.GHC的C后端不再被积极开发(这是我不支持的感觉).编译器的目标是C--或LLVM.
通常,我认为GCC是一个很好的老式成熟编译器,在优化代码方面表现很好,因此编译为C将使用GCC的成熟度来产生更好更快的代码.这不是真的吗?
我意识到这个问题在很大程度上取决于所编译语言的性质以及其他因素,以便获得更易于维护的代码.我正在寻找一个更为一般的答案(编译语言),专注于性能(无视代码质量,等等).如果答案包括解释为什么GHC偏离C以及为什么LLVM作为后端表现更好(参见本文)或编译器做任何其他我不了解的编译器的例子,我也会很高兴.
尽管Haskell 的正则表达式匹配引擎数量非常庞大,但我能找到的唯一一个可以替代的引擎是Text.Regex,虽然体面,但是我还是喜欢从pcre那里得到的一些东西.是否有任何基于pcre的包可以替代,还是我坚持这个?
我对Haskell比较陌生,我相信我误解了关于类型类的基本内容.假设我想创建一个类型类'T',实现由四个代数类型'A,B,C和D'支持的n-ary树,其结构最大深度为4.这似乎是一个愚蠢的例子,但我认为这最能说明我的观点.
module Test where
class T t0 where
parent :: T t1 => t0 -> Maybe t1
children :: T t1 => t0 -> [t1]
data A = A [B]
instance T A where
parent (A _) = Nothing
children (A bs) = bs
data B = B A [C]
instance T B where
parent (B a _) = Just a
children (B _ cs) = cs
data C = C B [D]
instance T C where
parent (C b …Run Code Online (Sandbox Code Playgroud) 我有这个haskell功能,我不太明白.
ns :: [Integer]
ns = 0 : [n+k | (n, k) <- zip ns [1,3..]]
Run Code Online (Sandbox Code Playgroud)
我被要求"需要3 ns".
我认为ns是常量所以它只会用列表的第一个元素压缩,给出(0,1).然后当添加时给出1的答案.然后它说"需要3 ns",所以我用列表的前5个元素压缩0,给出...(0,1),(0,3),(0,5 )然后在添加时,我得到[1,3,5]的最终答案.然而,这不是正确的答案.
ns真正发生了什么?我很难理解......
我正在通过以下方式进行列表连接(例如,使用GHC):
myConcat :: [[a]] -> [a]
myConcat xs = foldr (++) [] xs
myConcat = foldr (++) []
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释一下上述定义为何以及如何运作,而且这个定义没有:
myConcat xs = foldr (++) []
Run Code Online (Sandbox Code Playgroud)
是故意不允许的最后一行代码(由于构造可能会变得混乱,它是无用的等原因)或者是更深层次的东西,可能与currying有关...
我希望我能对此有所了解,这真让我感到困惑:/
后期编辑:除了下面给出的解释,我已经找到了关于这个问题的一个很好的信息来源,作为Chap的"部分功能应用和currying"部分.4"功能编程"来自"真实世界Haskell"一书.这本书可以在线免费获得.
我觉得自己像个白痴,甚至没有发布一些代码,但在阅读了几篇文章,说明iOS7 Text Kit增加了对文本折叠的支持,我实际上找不到任何示例代码或属性来设置文本折叠它和Apple的文档似乎静音就可以了.
http://asciiwwdc.com/2013/sessions/220让我想到我将文本区域设置到自己的文本容器中,然后显示/隐藏它,可能是通过覆盖setTextContainer:forGlyphRange:
我在附近吗?
谢谢
我正在使用看起来像这样的模式匹配来编写Haskell函数.
printLine :: [Int] -> [String]
printLine [] = error "Lege lijst levert niets op"
printLine [x] = "+" : replicate x "-"
printLine (x:xs) = ('+' : replicate x "-") : printLine xs
Run Code Online (Sandbox Code Playgroud)
基本案例工作,但GHC给出了一个错误的递归情况,如下所示:
Couldn't match expected type `Char' with actual type `[Char]'
In the second argument of `replicate', namely `"-"'
In the second argument of `(:)', namely `replicate x "-"'
In the first argument of `(:)', namely `('+' : replicate x "-")'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?请记住,我是Haskell的初学者和一般的函数式编程.我希望有人可以帮助我.
我正在尝试编写一个函数,从所有可以选择的卡中挑选一张随机卡.卡片属于我声明的名为rank的类型.我的代码看起来像这样:
data Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten
| Jack | Queen | King
deriving(Eq, Ord, Bounded, Enum, Show, Read)
pickCard :: Rank
pickCard = error "How should I pick a random card here? :("
Run Code Online (Sandbox Code Playgroud)
当然我想要这个函数做的是从列表中选择一个随机值[Ace .. King]我该怎么做?请记住,我是Haskell的初学者和一般的函数式编程.