[haskell]问个求子串位置的程序
本帖最后由 retuor 于 2010-07-16 12:40 编辑
做了个练习,大家给点意见。
Exercise 10. Write a function f :: String -> String -> Maybe Int
that takes two strings. If the second string appears within the first, it
returns the index identifying where it starts. Indexes start from 0. For
example,
f "abcde" "bc" ==> Just 1
f "abcde" "fg" ==> Nothing
我的想法是,如果 s2 是 s1=(x:xs) 的前缀,则返回 0,否则返回 1+ s2 在 xs 中的位置,如是递归下去。由于题目要求返回 Maybe 类型,最好能有 (Just 1)+(Just 1)=Just 2 之类的运算,所以写了个 Maybe Int 的 instance.
- instance (Num a)=> Num (Maybe a) where
- (Just n) + (Just m) = Just (n+m)
- _+_=Nothing
- f [] s2=Nothing
- f s1@(x:xs) s2 = if isPrefix s1 s2 then Just 0 else (Just 1)+ (f xs s2)
- where
- isPrefix _ [] = True
- isPrefix (x:xs) (y:ys) = if x==y then isPrefix xs ys else False
- isPrefix _ _ = False
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
嘿嘿,再次学到,
复制代码
[code]fmap (+1) (f xs s2) [code]
换成
[code]f xs s2 >>= (x -> return (x+1))[code]
也是差不多
一个用的functor 一个用的是monad
还可以直接使用 pattern match
比如写个
maybeAdd Nothing _ = Nothing
maybeAdd _ Nothing = Nothing
maybeAdd (Just x) (Just y) = Just (x+y)
helper function 相对来说也比 实现 一个 instance 来实现(+)要好点吧。。。。
fmap 好,改过来了。
复制代码可读性那个也很有道理,不过暂时不改了。
有收获,谢谢啊。
再补充点
isPrefix s1 s2
一般如果是这种名字的函数写成
s1 `isPrefix` s2 可读性是不是强点?
本帖最后由 SNYH 于 2010-07-17 20:16 编辑
复制代码而且你实现的这个Num 的instance 不完全其他的几个方法没有实现会出现警告的
另外 isPrefix 在Data.List 中有一个对应的函数 Data.List.isPrefixOf