step :: [Int] -> String -> [Int]
step (x:y:ys) "*" = (x*y):ys
step (x:y:ys) "+" = (x + y):ys
step (x:y:ys) "-" = (y - x):ys
step xs numString = read numString : xs

Rozszerzam moją wiedzę, http://learnyouahaskell.com/functionally-solving-problems, chcę spróbować zrobić trochę Postępowanie z Uwagi przy użyciu Maybe. Czy ktoś może dać mi trochę wskazówek lub jakiekolwiek użyteczne słowo kluczowe przy określaniu poniżej funkcji (jeśli mój pomysł ma rację)? Chcę wrócić Just sts po pomyślnym wprowadzeniu wartości wejściowej i Nothing, kiedy nie. Dunno Jeśli moja koncepcja ma rację, ktoś mnie poprawi.

 step2:: [Int] -> String -> Maybe [Int]
2
user12592710 6 styczeń 2020, 02:23

1 odpowiedź

Najlepsza odpowiedź

Twój sygnaturę typu ma rację. Oto możliwe wdrożenie:

import Text.Read (readMaybe)

step2 :: [Int] -> String -> Maybe [Int]
step2 (x:y:ys) "*" = Just $ (x*y):ys
step2 (x:y:ys) "+" = Just $ (x + y):ys
step2 (x:y:ys) "-" = Just $ (y - x):ys
step2 xs numString | Just num <- readMaybe numString = Just $ num:xs
step2 _ _ = Nothing

Podstawową ideą jest dla wszystkich istniejących przypadków, owinąć je w Just, a następnie na końcu, mają połowy - wszystkie Nothing. Istnieje trochę specjalnej obsługi dla read, ponieważ po prostu rzuca błąd, jeśli nie powiedzie się, więc musisz użyć readMaybe i dopasowania.


Jest inny sposób, w jaki możesz go napisać, który skraca się trochę:

import Text.Read (readMaybe)

step2 :: [Int] -> String -> Maybe [Int]
step2 (x:y:ys) "*" = Just $ (x*y):ys
step2 (x:y:ys) "+" = Just $ (x + y):ys
step2 (x:y:ys) "-" = Just $ (y - x):ys
step2 xs numString = fmap (:xs) (readMaybe numString)

Udało nam się dokonać tej zmiany z kilku powodów:

  • readMaybe zwraca jego wynik zawinięty w ten sam typ, że nasza funkcja będzie (Maybe)
  • Ten wspólny typ (Maybe) jest Functor

Z tego powodu możemy zastosować fmap do wyjścia readMaybe, aby połączyć dwa ostatnie przypadki. Dla typu Maybe fmap działa, pozostawiając Nothing jako Nothing lub zmiana Just x do Just (f x), co jest dokładnie co W każdym razie robiliśmy.

5
Joseph Sible-Reinstate Monica 7 styczeń 2020, 02:43