E4 / Bespin
昨天还在闲聊的时候和同事聊到有关于Eclipse IDE in Web的话题,起因似乎关于Flex的能力和可能的应用场景。今天便发现有人已经开始行动,并且有所成果了。
E4/Bespin, 一个基于Mozilla Lab Bespin项目的扩展,已经可以玩玩了。
我尝试着按照E4/Bespin页面上面的说明,安装如同小风吹一样顺畅。
about coding, life and all the beta things.
昨天还在闲聊的时候和同事聊到有关于Eclipse IDE in Web的话题,起因似乎关于Flex的能力和可能的应用场景。今天便发现有人已经开始行动,并且有所成果了。
E4/Bespin, 一个基于Mozilla Lab Bespin项目的扩展,已经可以玩玩了。
我尝试着按照E4/Bespin页面上面的说明,安装如同小风吹一样顺畅。
Posted by Unknown at 1:24:00 PM 0 comments
RWH上在讲述 functional programming 中的fold的时候举了个例子,说foldl也可以由foldr来实现,具体的代码如下:
foldl :: (a->b->a)->a->[b]->a
foldl f z xs = foldr step id xs z
where step x g a = g (f a x)
foldl (+) 0 [1,2,3] -->
foldr step id [1,2,3] 0 -->
step 1 (step 2 (step 3 id)) 0 -->
step 2 (step 3 id) (1 + 0) -->
step 3 id ((1+0)+2) -->
id (((1+0)+2)+3)
foldr
实现takeWhile
,倒是一个很好的回顾。先试着用foldl来实现一把,毕竟takeWhile应该从左边开始计算。
takeWhile_foldl :: (a->Bool)->[a]->[a]
takeWhile_foldl p xs = head (foldl step [[]] xs)
where step x y | p y = init x ++ [last x ++ [y]]
| otherwise = x ++ [[]]
takeWhile_foldr :: (a->Bool)->[a]->[a]
takeWhile_foldr p xs = head (foldr step id xs [[]])
where step x g a | p x = g (init a ++ [last a ++ [x]])
| otherwise = g (a ++ [[]])
Posted by Unknown at 1:37:00 PM 0 comments
Labels: haskell
isSuffixOf
是Haskell中的一个常见的List操作,因此也是Prelude
的一员。isSuffixOf
的功效类似于Java中String.contains
,只不过由于在Haskell中String就是一个List of Char,因此isSuffixOf
可以应用于更广泛的List而非String。
在看RWH的时候,在尝试着使用现有的几个List函数来实现一下isSuffixOf
,凭着我已有的知识和习惯,给出了如下的代码:
为了表示和我传统的Imperative编成方式有所区别,我尝试了使用higher-order functions,pattern matching还有递归。然而,当我看到了GHC的标准库中的实现后,还是大吃一惊。可以和Java中的String.indexOf做一下比较。
myisInfixOf :: (Eq a)=>[a]->[a]->Bool
myisInfixOf [] _ = True
myisInfixOf _ [] = False
myisInfixOf x y = let (pre, suf) = break (==(head x)) y
in if isPrefixOf x suf
then True
else case suf of
[] -> False
otherwise -> myisInfixOf x $ tail suf
isInfixOf :: (Eq a) => [a] -> [a] -> Bool这个实现在一个tails序列中,寻找任意(any)一个元素,以needle开始。简洁明了,令人吃惊。最有趣的一个地方便是这个tails序列。它首先得到一个序列的tail,然后依次创建tail的tail。这样any查找才起作用。
isInfixOf needle haystack = any (isPrefixOf needle) (tails haystack)
Posted by Unknown at 11:35:00 AM 0 comments
来自LtU,Programming in Scala和Real World Haskell同时入围今年的Jolt的Book technical的最后评选名单。
应该可以说明,越来越多的人开始重视functional programming语言了。
Posted by Unknown at 1:36:00 PM 0 comments
Labels: FP
前些日子去淮海路,发现心仪的三联书店关了,那应该还是10月份的时候,取而代之的是不知道那家服装店,或是其他类似的东西。这家三联书店店面不大,因此并没有很多空间放置畅销书,教参,家庭百宝书,美容减肥指南等,因此常常会有惊喜。有一次买到过安东尼 伯尔顿这个"流氓"大厨的书。
今天去龙之梦,发现龙强书屋门口的铁栅卷帘门也合的严严实实。原本安排的一天的计划,第一项就没能实践。龙强书店巨大,充斥了各种书籍,三联没有的它都有,并且有过之而无不及。正因为如此,也常常会有惊喜。其他地方找不到的书,往往躺在某个布满灰尘的角落里。
其他的那些自以为有品位的书店,有个有品位的名字,搞些有品位的活动的那种,反而逛起来毫无乐趣可言。
Posted by Unknown at 12:46:00 PM 0 comments
昨天在做Programming Haskell上面的一道练习,脚踏实地的感受了一下Haskell的lazy evaluation得特性。
题目很简单,给出了一个函数unfold
,定义如下
unfold :: (b -> Bool) -> (b -> a) -> (b -> b) -> b -> [a]
unfold p h t x | p x = []
| otherwise = h x : unfold p h t (t x)
iterate :: (a->a)->a->[a]
iterate f = unfold nf id f
where nf x = False
nf x = False
。然而这个判断,却在Haskell面前不成立,起码在当前的这个情况下,因为lazy的Haskell并不急匆匆的一定要找到递归的终止条件不可,才能完成计算。因为在很多情况下,这并非必要。比如,在GHCi下运行take 8 & iterate (*2) 1
,便会得到[1,2,4,8,16,32,64]
这样一个序列。 我只需要前8个元素,为什么一定要全计算完呢。
Posted by Unknown at 11:12:00 AM 0 comments
Labels: haskell
Merge Sort is a kind of fast sorting algorithm with O(nlog(n))
order.
Merge sort itself is a recursive algorithm and can be expressed neatly even in an Imperative programming like Java. However pattern matching and high order functions in Scala can make this even interesting.
def mergeSort(list:List[Int]):List[Int] = list match {
case x::Nil=> List(x)
case _ =>
val (a, b) = list.splitAt(list.length /2)
merge(mergeSort(a), mergeSort(b))
}
def merge(aList:List[Int], bList:List[Int]):List[Int]= bList match {
case Nil => aList
case _ =>
aList match {
case Nil => bList
case x::xs =>
if (x < bList.head)
x::merge(xs, bList)
else
bList.head::merge(aList, bList.tail)
}
}
Posted by Unknown at 3:02:00 PM 1 comments
Labels: scala
© Blogger template 'Grease' by Ourblogtemplates.com 2008
Back to TOP