有没有一种方法可以避免仅使用'>> ='运算符或'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')
我的意思是这样的:
rep :: Int -> Song -> Maybe Song
rep 1 s = Just s
rep i s | i > 1 = rep (i-1) s >>= return . Concat s
| otherwise = Nothing