0はint型であるため、すべてa
で機能しません。私はそうのようなMaybe a
を使用する代わりに、お勧めします:
lastButOne :: [a] -> Maybe a
lastButOne [] = Nothing
lastButOne [x] = Nothing
lastButOne xs = Just $ list !! (length xs - 2)
使用警備員:MonadPlusの任意のインスタンスに対して、一般的には
import Control.Monad (guard)
lastButOne :: [a] -> Maybe a
lastButOne list = guard (length list > 1) >> return (list !! (length list - 2))
:
lastButOne :: [a] -> Maybe a
lastButOne xs | length xs > 1 = Just $ list !! (length list - 2)
| otherwise = Nothing
たぶんのMonadPlusのインスタンスを使用します:
import Control.Monad (guard)
lastButOne :: MonadPlus m => [a] -> m a
lastButOne list = guard (length list > 1) >> return (list !! (length list - 2))
どこかで、結果をMaybeにしたいとコンパイラに指定する必要があります。通常、これは型が推定されます。これは、Maybeを期待する関数に渡されるためです。
これはO(n)で実行されることに注意してください。おそらくあなたはリストの最後から2番目の要素を見つけたいと思わないでしょう...なぜこれを行う必要がありますか?代わりに配列を使うことを少なくとも考えてください。
あなたが実際に返すようにしたいものを明確ではありません。おそらく意味がありますか? –
@Craig "最後から2番目の要素" – alternative
リストの型である "a"ではなく整数を返すように型シグネチャを作成する – Ankur