如何避免仅使用>> =运算符[关闭]

问题描述 投票:0回答:1

有没有一种方法可以避免仅使用'>> ='运算符或'do'表示法使用from?我知道fromJust引发了Nothing条目的例外。所以我的想法是避免使用绑定'>> ='运算符或使用do表示法来使用它,我有一些使用'>> ='的实践,但我对do表示法的工作原理一无所知听说我可以使用它解决问题。如果您能为我提供任何帮助,对于您的英语不好,我将非常感谢。

    data Song = Fragment [Primitive Pitch]
          | Transpose_by Int Song
          | Repeat Int Song
          | Concat Song Song
          | Parallel Song Song
          deriving (Show)


tra :: Int -> Song -> Song
tra i (Fragment ns) = Fragment $ map (\pp -> case pp of
                                     (Note d p) -> Note d $ (trans i) p
                                     (Rest d) -> Rest d) ns
tra i (Transpose_by j s) = tra (i+j) s
tra i (Repeat j s) = Repeat j (tra i s)
tra i (Concat s s') = Concat (tra i s) (tra i s')
tra i (Parallel s s') = Parallel (tra i s) (tra i s')

rep :: Int -> Song -> Maybe Song
rep 1 s = Just s
rep i s | i > 1 = Just $ Concat s $ fromJust $ rep (i-1) s
        | otherwise = Nothing

unfold :: Song -> Maybe Song
unfold (Fragment []) = Nothing
unfold (Fragment ns) = Just $ Fragment ns
unfold (Transpose_by i s) = Just $ tra i s
unfold (Repeat i s) = rep i s
unfold (Concat s s') = Just $ Concat (fromJust $ unfold s) (fromJust $ unfold s')
unfold (Parallel s s') = Just $ Parallel (fromJust $ unfold s) (fromJust $ unfold s')
haskell bind maybe do-notation
1个回答
0
投票

我的意思是这样的:

rep :: Int -> Song -> Maybe Song
rep 1 s = Just s
rep i s | i > 1 = rep (i-1) s >>= return . Concat s
        | otherwise = Nothing
© www.soinside.com 2019 - 2024. All rights reserved.