[haskell]问个求子串位置的程序

发布于 2022-09-03 05:04:25 字数 1612 浏览 36 评论 5

本帖最后由 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.

  1. instance (Num a)=> Num (Maybe a) where
  2.     (Just n) + (Just m) = Just (n+m)
  3.     _+_=Nothing                          
  4. f [] s2=Nothing
  5. f s1@(x:xs) s2 = if isPrefix s1 s2 then Just 0 else (Just 1)+ (f xs s2)
  6.                  where
  7.                    isPrefix _ [] = True
  8.                    isPrefix (x:xs) (y:ys) = if x==y then isPrefix xs ys else False
  9.                    isPrefix _ _ = False

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

清君侧 2022-09-09 05:02:39

嘿嘿,再次学到,

  1. f [] s2=Nothing
  2. f s1@(x:xs) s2 = if isPrefix s1 s2 then Just 0 else (f xs s2)>>=return.(+1)
  3.                  where
  4.                    isPrefix _ [] = True
  5.                    isPrefix (x:xs) (y:ys) = if x==y then isPrefix xs ys else False
  6.                    isPrefix _ _ = False

复制代码

等待圉鍢 2022-09-08 15:20:34

[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 来实现(+)要好点吧。。。。

素染倾城色 2022-09-06 02:10:33

fmap 好,改过来了。

  1. f [] s2=Nothing
  2. f s1@(x:xs) s2 = if isPrefix s1 s2 then Just 0 else fmap (+1) (f xs s2)
  3.                  where
  4.                    isPrefix _ [] = True
  5.                    isPrefix (x:xs) (y:ys) = if x==y then isPrefix xs ys else False
  6.                    isPrefix _ _ = False

复制代码可读性那个也很有道理,不过暂时不改了。

有收获,谢谢啊。

霓裳挽歌倾城醉 2022-09-05 21:17:37

再补充点
isPrefix s1 s2
一般如果是这种名字的函数写成
  s1 `isPrefix` s2  可读性是不是强点?

苍风燃霜 2022-09-04 21:26:04

本帖最后由 SNYH 于 2010-07-17 20:16 编辑

  1. else (Just 1)+ (f xs s2)
  2. 可以改为
  3. else  fmap (+1) (f xs s2)
  4. 不需要instance
  5. Maybe 是一个典型的functor

复制代码而且你实现的这个Num 的instance 不完全其他的几个方法没有实现会出现警告的

另外 isPrefix 在Data.List 中有一个对应的函数  Data.List.isPrefixOf

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文