搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 2433|回复: 49
收起左侧

在研究Haskell的函数式编程

[复制链接]

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
发表于 2012-8-1 00:32:21 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
本帖最后由 轻舟过 于 2012-8-1 00:55 编辑

最近两天做了Haskell 99题中的前20道
函数式编程解决问题的思路还真是不一样
还有函数式编程是不是研究Lisp更好一点。。

题目链接在这里:http://www.haskell.org/haskellwiki/99_questions
相应的还有Prolog、Lisp、Perl、OCaml的99题

论坛的SyntaxHighlighter插件怎么没有Haskell的语法高亮

[mw_shl_code=text,true]-- #1
myLast :: [a] -> a
myLast (x:[]) = x
myLast (x:xs) = myLast xs

-- #2
myButLast :: [a] -> a
myButLast (x1:x2:[]) = x1
myButLast (x1:x2:xs) = myButLast (x2:xs)

-- #3
elementAt :: [a] -> Int -> a
elementAt (x:xs) 1 = x
elementAt (x:xs) idx = elementAt xs (idx - 1)

-- #4
myLength :: [a] -> Int
myLength xs = foldl (+) 0 $ map (\x -> 1) xs

-- #5
myReverse :: [a] -> [a]
myReverse = foldl (\xs x-> x:xs) []

-- #6
isPalindrome :: (Eq a) => [a] -> Bool
isPalindrome xs = xs == myReverse xs

data NestedList a = Elem a | List [NestedList a] deriving (Show)
-- #7
flatten :: NestedList a -> [a]
flatten (Elem x) = [x]
flatten (List lst) = foldl (++) [] $ map flatten lst

-- #8
compress :: (Eq a) => [a] -> [a]
compress [] = []
compress all@(x:xs) = (head $ takeWhile (==x) all):compress(dropWhile (==x) all)

-- #9
pack :: (Eq a) => [a] -> [[a]]
pack [] = []
pack all@(x:xs) = (takeWhile (==x) all):pack(dropWhile (==x) all)

-- #10
encode :: (Eq a) => [a] -> [(Int, a)]
encode [] = []
encode all@(x:xs) = ((myLength $ takeWhile (==x) all), x):encode(dropWhile (==x) all)

data RunLengthCode a = Single a | Multiple Int a deriving (Show)

-- #11
encodeModified :: (Eq a) => [a] -> [RunLengthCode a]
encodeModified [] = []
encodeModified lst = map toRunLengthCode $ encode lst
        where toRunLengthCode pair = if fst pair == 1 then (Single (snd pair)) else (Multiple (fst pair) (snd pair))

-- #12
decodeModified :: [RunLengthCode a] -> [a]
decodeModified [] = []
decodeModified ((Single x):xs) = [x] ++ decodeModified(xs)
decodeModified ((Multiple len x):xs) = (replicate len x) ++ decodeModified(xs)


-- #13
encodeDirect :: (Eq a) => [a] -> [RunLengthCode a]
encodeDirect [] = []
encodeDirect all@(x:xs) = code:encodeDirect(dropWhile (==x) all)
        where         len = myLength $ takeWhile (==x) all
                code = if len == 1 then (Single x) else (Multiple len x)

-- #14
dupli :: [a] -> [a]
dupli [] = []
dupli (x:xs) = [x, x] ++ dupli(xs)

-- #15
repli :: [a] -> Int -> [a]
repli [] _ = []
repli (x:xs) cnt = (replicate cnt x) ++ (repli xs cnt)

-- #16
{-
- dropEvery = flip $ \n -> map snd . filter ((n/=) . fst) . zip (cycle [1..n])
-}
dropEvery :: [a] -> Int -> [a]
dropEvery lst cnt = map snd $ filter (\p -> (fst p) `mod` cnt /= 0) $ zip [1..] lst

-- #17
split :: [a] -> Int -> ([a], [a])
split lst len = (take len lst, drop len lst)

-- #18
slice :: [a] -> Int -> Int -> [a]
slice lst start end = fst $ split (drop (start - 1) lst) (end - start + 1)

-- #19
rotate :: [a] -> Int -> [a]
rotate lst num = (drop len lst) ++ (take len lst)
        where        lstLen = length lst
                len = (num `mod` lstLen + lstLen) `mod` lstLen

-- #20
removeAt :: Int -> [a] -> (a, [a])
removeAt num lst = (head lstTail, (take (num - 1) lst) ++ (tail lstTail))
        where lstTail = drop (num - 1) lst
[/mw_shl_code]

然后还有spoj上的TEST
[mw_shl_code=text,true]main = do
        line <- getLine
        if line == "42"
                then getContents
                else do
                        putStrLn line
                        main[/mw_shl_code]
博客什么的求人气 http://bimania.org
回复

使用道具 举报

该用户从未签到

5

主题

35

好友

1万

积分

第一章

积分
12268
发表于 2012-8-1 09:05:19 | 显示全部楼层
@14*Haskell是纯函数,Lisp只是“可以这么干”
另外想吐槽下Haskell的环境真TM大啊
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

97

主题

75

好友

1万

积分

第一章

积分
11926
发表于 2012-8-1 10:12:51 | 显示全部楼层

根本看不懂~
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
 楼主| 发表于 2012-8-1 10:17:40 | 显示全部楼层

Lisp用过程式也可以
Haskell的环境你说的Haskell Platform?确实挺大的
博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
 楼主| 发表于 2012-8-1 10:24:17 | 显示全部楼层

没学过的话应该看不懂
Haskell比较奇葩,和一般语言不一样
博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

该用户从未签到

97

主题

75

好友

1万

积分

第一章

积分
11926
发表于 2012-8-1 10:48:23 | 显示全部楼层
轻舟过 发表于 2012-8-1 10:24
没学过的话应该看不懂
Haskell比较奇葩,和一般语言不一样


8月 Ruby之月
9月 Python之月
10月 ...Haskell?
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
 楼主| 发表于 2012-8-1 10:55:08 | 显示全部楼层
Richeir 发表于 2012-8-1 10:48
8月 Ruby之月
9月 Python之月
10月 ...Haskell?

Haskell太小众了不适合推广啊
另外一种语言只有一个月大丈夫?
博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

35

好友

1万

积分

第一章

积分
12268
发表于 2012-8-1 13:41:01 | 显示全部楼层
Richeir 发表于 2012-8-1 10:48
8月 Ruby之月
9月 Python之月
10月 ...Haskell?

@3*ruby的话一个月估计悬
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
 楼主| 发表于 2012-8-1 13:43:23 | 显示全部楼层
前原圭一 发表于 2012-8-1 13:41
ruby的话一个月估计悬

博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

35

好友

1万

积分

第一章

积分
12268
发表于 2012-8-1 13:47:10 | 显示全部楼层
轻舟过 发表于 2012-8-1 10:17
Lisp用过程式也可以
Haskell的环境你说的Haskell Platform?确实挺大的

@18*嗯,感觉这语言也就用来玩玩?
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

28

主题

103

好友

9783

积分

技术宅认证程序员

苦逼,受剥削人民

积分
9783
发表于 2012-8-1 13:48:08 | 显示全部楼层
Richeir 发表于 2012-8-1 10:48
8月 Ruby之月
9月 Python之月
10月 ...Haskell?

Ruby学了
Python就无所谓了吧
同样的东西
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

97

主题

75

好友

1万

积分

第一章

积分
11926
发表于 2012-8-1 13:49:49 | 显示全部楼层
前原圭一 发表于 2012-8-1 13:41
ruby的话一个月估计悬


基础而已
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

97

主题

75

好友

1万

积分

第一章

积分
11926
发表于 2012-8-1 13:50:37 | 显示全部楼层


新手入门而已,大家得让什么都不懂的人能够读了咱们的帖子然后入门啊
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
 楼主| 发表于 2012-8-1 13:50:41 | 显示全部楼层
前原圭一 发表于 2012-8-1 13:47
嗯,感觉这语言也就用来玩玩?

应该还是有一些实际项目的
Haskell还有Web框架Snap和Yesod
博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
 楼主| 发表于 2012-8-1 13:51:23 | 显示全部楼层
秋声赋 发表于 2012-8-1 13:48
Ruby学了
Python就无所谓了吧
同样的东西

嗯,类似的
博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-5-4 04:59 , Processed in 0.115612 second(s), 22 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表