我有以下的功能就像一個索引操作:Haskell中的Just是什麼?爲什麼沒有它,這個函數不能工作?
let {
index :: [a]->Int->Maybe a
index [] i = error "Empty list"
index l i = if i <= ((length l) - 1) && i >= 0 then
Just(l !! i)
else
error "Index out of bounds"
}
現在,我開始寫這不使用Just
(和我還是不明白什麼是谷歌搜索後):
let {
index :: [a]->Int->Maybe a
index [] i = error "Empty list"
index l i = if i <= ((length l) - 1) && i >= 0 then
(l !! i)
else
error "Index out of bounds"
}
對我而言,上述功能非常有意義。因爲這裏我有一個函數,它接受'通用類型'a
和Int
這是索引並返回Maybe
值a
的值或拋出運行時異常。但是,我不明白的地方GHCI告訴我這個位:
<interactive>:1:120:
Couldn't match type `a' with `Maybe a'
`a' is a rigid type variable bound by
the type signature for index :: [a] -> Int -> Maybe a
at <interactive>:1:34
Expected type: [Maybe a]
Actual type: [a]
In the first argument of `(!!)', namely `l'
In the expression: (l !! i)
現在,爲什麼GHCI感到困惑與l
類型,爲什麼它期待Maybe a
類型的列表?最後,Just
如何解決問題?
代碼大師,現在我的代碼在你編輯後看起來很舒服:) – badmaash 2012-07-26 21:03:56
你真的喜歡用你最初發布的單行代碼寫你的定義嗎? – gspr 2012-07-26 21:04:34
其實,我絕對不會寫這樣的單行,因爲我來自C++/VB.NET背景。由於Haskell爲我提供了選擇編寫 - 編譯 - 執行還是隻寫執行的選項,我的懶惰更喜歡第二種選擇。另外,我剛開始學習它,所以只有'玩具程序'會這樣寫。也許我不知道我是否可以在GHCi的多行中分割我的代碼,是嗎? – badmaash 2012-07-26 21:12:06