2014-05-05 33 views
0

我必須寫在Haskell功能如何才能在哈斯克爾列表中的位置:使用也許

safeIndex :: [b] -> Integer -> Maybe b 

所以當它得到一個列表中的元素,它會給我們一個Just當它不是它給我們Nothing

ghci> [1..10] 'safeIndex' 3 

Just 4 

ghci> [1..10] 'safeIndex' 10 

Nothing 

,我真的不是在

+0

這功課嗎? –

+0

作業類..它的演講 – Samara92

+0

培訓將它分級嗎? –

回答

1

這是從不安全版本的微小變化。

(!!) :: [a] -> Int -> a 
[]  !! n = error "What" 
(a:as) !! 0 = a 
(a:as) !! n = as !! (n-1) 

而是與error失敗,我們應該失敗,Nothing的。這將導致功能的其餘部分不作爲類型檢查退貨類型已經改變

(!!) :: [a] -> Int -> Just a 

爲了解決這個問題,我們必須與標籤的成功Just也。最後,遞歸調用應該仔細考慮。它是否需要任何類型的標籤?這取決於它是否失敗,但我們無法知道,直到我們實際進入遞歸調用...

1

我會給你提示就如何實現這一成功:

  • 想想當輸入列表爲空時該怎麼做的情況。
  • 想一想當輸入列表非空時該怎麼做的另一種情況。

你必須使用遞歸來解決它。當你有一個空的列表,你必須返回Nothing。如果你找到一個特定索引的元素,你可以將結果包裝在Just中並返回。我認爲它現在應該直接轉換成Haskell代碼。

+0

safeIndex :: [B] - >整數 - >也許b safeIndex [] =沒有 告訴我這裏有它的一半。我得到了與其他部分的問題,如何將結果包裝到Just中並將其返回 – Samara92

+0

@ user3604901請參閱@ bheklilr的函數定義並嘗試填充它中的'???'。他的定義還向你展示瞭如何用「Just」包裝結果。 – Sibi

0

hoogle,它看起來並不像在基礎庫一個存在,但你可以寫一個很容易,但我會說出它!?

(!?) :: [a] -> Int -> Maybe a 
[]  !? _ = Nothing 
(x:xs) !? 0 = Just x 
(x:xs) !? i = ??? 

我會讓你填在???的情況下,你可以從@ Sibi的回答中得到一些提示。請記住,這不處理負指數,如果你要那還有那麼我建議使用守衛來代替:

[] !? _ = Nothing 
(x:xs) !? i 
    | i < 0 = ??? 
    | i == 0 = Just x 
    | otherwise = ??? 
+0

safeIndex(x:xs)i = ???? x(safeIndex xs) – Samara92

+0

我認爲^^ 2周的程序員,它對我仍然很難:D – Samara92

+1

或者它將會是** safeIndex(x:xs)i = xs safeIndex(i-1)** – Samara92