2016-05-15 118 views
1

我試圖得到這個工作:如何爲矢量矢量創建一個Maybe等價物?

type CharVector = V.Vector Char 
type CharMatrix = V.Vector CharVector 

data MaybeCharMatrix = 
    Nothing 
    | CharMatrix 

但我不能做以下事情:

1)模式匹配

test :: MaybeCharMatrix -> Int 
test Nothing = -1 -- Doesn't matter, is just to illustrate 
test <something> = ? -- Somehow be able to do: cols <something> * rows 

2)推導show instance:

instance Show MaybeCharMatrix where 
    show Nothing = "" 
    show <something> = "Cols: " ++ cols <something> ++ ", Rows: " ++ rows <something> 

這是如何實現的?有沒有其他有效的方法來做到這一點?

+2

'data MaybeCharMatrix = Nothing | CharMatrix' - 在這裏CharMatrix是一個構造函數AFAIK,**不是**也稱爲'CharMatrix'的類型。 – immibis

回答

3

如何使用:

type MaybeCharMatrix = Maybe CharMatrix 

test :: MaybeCharMatrix -> Int 
test Nothing = -1 
test (Just matrix) = ... 

這不會允許你創建自己的自定義顯示的實例,所以這裏的另一種選擇:

newtype MaybeCharMatrix = MCM (Maybe CharMatrix) 

test :: MaybeCharMatrix -> Int 
test (MCM Nothing) = -1 
test (MCM (Just matrix)) = ...some function of matrix... 

instance Show (MaybeCharMatrix) where 
    show (MCM Nothing) = "the nothing string" 
    show (MCM (Just matrix)) = ... "Cols: " ++ show (cols matrix) ++ ... 

我覺得你最好只使用type別名(第一個選項)。然後你可以直接使用所有在Maybe值上運行的函數。

show最適用於值的Haskell表示 - 即它應該是一個有效的Haskell表達式。如果您想要自定義渲染值,只需爲渲染函數使用不同的名稱 - 例如dumpMatrix

更新

根據你的評論是這樣的:

data MaybeCharMatrix = MyNothing | MyJust CharMatrix 

test :: MaybeCharMatrx -> Int 
test MyNothing = -1 
test (MyJust matrix) = ... can use matrix here ... 

instance Show MaybeCharMatrix where 
    show MyNothing = "my nothing" 
    show (MyJust matrix) = "... Cols: " ++ show (cols matrix) ++ ... 
+0

這是我的錯。問題是我想要的簡單案例。這只是一個概念的例子。我希望能夠實現問題背後的概念(用於學習目的)。很抱歉,如果它不夠清楚。 – OneEyeQuestion

+0

答覆已更新。 – ErikR

3

你的問題是與數據類型聲明。一般來說,類型聲明的形式是。

data <type> <args> = <constructor 1> <args> 
        | <constructor 2> <args> 
        | ... 
        | <constructor n> <args> 

換句話說,數據聲明每個子句中的第一個表達式被認爲是數據構造函數。所以,當你使用你的數據類型。

data MaybeCharMatrix = Nothing | CharMatrix 

Haskell中對待CharMatrix作爲數據構造不是一個類型。您定義的Nothing也與標準庫定義衝突,所以您應該更改其名稱。你真正想要的是這樣的。

data MaybeCharMatrix = NothingCM | JustCM CharMatrix 

,創建一個數據構造JustCM這需要一個CharMatrix作爲其參數。然後,你可以像這樣模式匹配。

test :: MaybeCharMatrix -> Int 
test NothingCM = -1 
test (JustCM mat) = <code> 

instance Show MaybeCharMatrix where 
    show NothingCM = "" 
    show (JustCM mat) = "Cols: " ++ cols mat ++ ", Rows: " ++ rows mat 
+0

也會接受你的答案,但其他人先回答。抱歉。 – OneEyeQuestion