2014-12-09 88 views
0

我想編寫一個函數,接受一個數字i和數字xs和 回報i列表xs位置的列表,計數第一個位置爲1。如果i確實 找到元素不會發生xs,然後position返回0Haskell-在列表

到目前爲止,我有這樣的:

import Data.List 
position :: Int -> [Int] -> Int 
position i xs 
    | i `elem` xs = i `elemIndex` xs 
    | otherwise = 0 

但是當我編譯,它提供了以下錯誤:

Couldn't match expected type ‘Int’ with actual type ‘Maybe Int’

我知道elemIndex返回Maybe Int類型,我定義我的函數返回Int,但我不知道如何去改變它。有任何想法嗎?

+0

您可以使用fromJust(在Data.Maybe定義)如果你確信它總是一個Just,就打開它的價值。 – erdeszt 2014-12-09 11:59:29

回答

4

首先,列表索引0…。因此elemIndex將返回Just 0如果i碰巧是您的列表中的第一個元素。

由於elemIndex回報Maybe Int,你可以在它的結果,而不是模式匹配:

import Data.List 

position :: Eq a => a -> [a] -> Int 
position i xs = maybe 0 (+1) $ i `elemIndex` xs 
5

我認爲,上述解決方案可以使用maybe功能是一個班輪甚至在haskell的標準前奏中使用zip函數:) 只需用[1 ..]壓縮它,然後使用它提供的列表理解。 看看這裏的代碼:

positions n xs = [y | (y,z) <- zip [1..] xs, z==n]

要查找出現次數的數量,只需使用長度從標準的前奏:

+0

它不需要'import Data.Maybe(也許)'? – 2017-02-17 02:49:27

+0

@StéphaneLaurentno。 '可能'由'Prelude'(重新)導出。 – Zeta 2017-02-17 05:31:51

0

,你可以:

import Data.List (elemIndex) 

position :: Eq a => a -> [a] -> Int 
position i xs = 
    case i `elemIndex` xs of 
     Just n -> n + 1 
     Nothing -> 0