我最终搞清楚了.请参阅我给出的演讲的视频和幻灯片:
原始问题:
在我努力理解通用递归方案(即使用Fix
)时,我发现编写各种方案的仅列表版本很有用.它使得理解实际方案变得更加容易(没有额外的开销Fix
).
但是,我还没有想出如何定义只列出版本zygo
和futu
.
以下是我目前的专门定义:
cataL :: (a -> b -> b) -> b -> [a] -> b
cataL f b (a : as) = f a (cataL f b as)
cataL _ b [] = b
paraL :: (a -> [a] -> b -> b) -> b -> [a] -> b
paraL f b (a : as) = f a as (paraL f b as)
paraL _ b …
Run Code Online (Sandbox Code Playgroud) 我有一个单元测试文件:
module X04PatMatTest where
import AssertError
import Test.HUnit
import X04PatMat
...
Run Code Online (Sandbox Code Playgroud)
和hlint抱怨:
X04PatMatTest.hs:15:69: Warning: Use string literal
Found:
['a', 'b', 'd']
Why not:
"abd"
Run Code Online (Sandbox Code Playgroud)
由于各种原因,我真的想要['a', 'b', 'd']
输入测试代码.
我尝试了各种各样的permuatations
{-# ANN X04PatMatTest "HLint: ignore Warning: Use string literal" #-}
Run Code Online (Sandbox Code Playgroud)
比如将pragma作为文件的第一行,在模块声明之后,用名称module
代替X04...
,将... 更改Warning
为warn
...
什么是魔术?
我知道有两种方法可以将接口规范与Haskell中该接口的实现分开:
类型类,例如:
RandomGen
StdGen
记录,例如:
Network.Transport
Network.Transport.TCP
问题1:什么时候适合使用其中一种?
问题2:在Haskell中分离接口/ impl有哪些其他方法?
编写一个函数,将右边第二个数字开头的其他数字加倍:
例:
doubleEveryOther [8,7,6,5]
=> [16,7,12,5]
doubleEveryOther [1,2,3]
=> [1,4,3]
Run Code Online (Sandbox Code Playgroud)
O(n)解决方案:
doubleEveryOther :: Num a => [a] -> [a]
doubleEveryOther xs0 =
let (_,r) = deo xs0
deo xs1 = case xs1 of
[] -> (False, [])
(x:xs) -> let (b, xs') = deo xs in ((not b), (if b then 2*x else x) : xs')
in r
Run Code Online (Sandbox Code Playgroud)
以上对显式递归的使用通常被认为是差的Haskell样式(例如,在可能的情况下使用fold*,scan等).
质询
Haskell库函数涵盖了上述情况?
什么是更简洁/惯用的Haskell解决方案仍然是O(n)?
是否有上述类型的递归的名称(我们使用更深层递归的值来做出下一级别的决定)?
我正在练习Martin Odersky的Scala和Haskell的"Scala中的功能编程原理"课程.对于"设置为函数"练习,我定义了一个"toString"函数:
import Data.List (intercalate)
type Set = Int -> Bool
contains :: Set -> Int -> Bool
contains s elem = s elem
bound = 1000
toString :: Set -> String
toString s =
let xs = [(show x) | x <- [(-bound) .. bound], contains s x]
in "{" ++ (intercalate "," xs) ++ "}"
-- toString (\x -> x > -3 && x < 10)
-- => "{-2,-1,0,1,2,3,4,5,6,7,8,9}"
Run Code Online (Sandbox Code Playgroud)
能够定义:很高兴:
instance Show Set where
show Set = ... …
Run Code Online (Sandbox Code Playgroud) 而不是发明我自己的,对于典型的Haskell任务,例如编译,打包,hlint,quickcheck等,有什么好的makefile规则?
在搜索中我发现像这样的例子:
ghc -M *.hs
Run Code Online (Sandbox Code Playgroud) 到目前为止,我发现:
http://monads.haskell.cz/html/writermonad.html
http://en.wikipedia.org/wiki/Monad_(functional_programming)
Run Code Online (Sandbox Code Playgroud)
给出了>>=
和的定义return
官方代码在哪里?
haskell ×7
hlint ×2
recursion ×2
typeclass ×2
cabal ×1
interface ×1
makefile ×1
monads ×1
polymorphism ×1
quickcheck ×1
writer-monad ×1