我有一個如下定義的狀態:
newtype State a = State Stack
data Stack = Active [Maybe Int] | Inactive [Maybe Int]
State 是一個 State Stack,其中每個 Stack 可以是 Maybe Ints 的 Active 或 Inactive 串列。接下來按照給定的方式創建一個空狀態:
empty :: State a
empty = State (Active [])
現在我想向我嘗試過的狀態添加一個元素:
addToStack :: State a -> a -> State a
addToStack State(Stack element) a =
State(Stack element : a)
我使用 Stack 一詞來保留 State 的 Stack 部分,向 State 添加元素不應將 State 從 active 更改為 Inactive,反之亦然。有一個更好的方法嗎?因為現在它給了我:
Not in scope: data constructor ‘Stack’
uj5u.com熱心網友回復:
當你寫
data Stack = Active [Maybe Int] | Inactive [Maybe Int]
你正在做兩件事。首先,您要引入一種新型別,稱為Stack. 接下來,您將介紹兩個稱為和的新術語(即值)。這些值分別具有型別:ActiveInactive
Active :: [Maybe Int] -> Stack
Inactive :: [Maybe Int] -> Stack
此外,這些值是“特殊的”,因為 Haskell 知道如何[Maybe Int]從值中取出Active(即,它們是建構式并且可以進行模式匹配)。
關鍵是這Stack只是一個型別,而不是一個值,并且Active只是Inactive值,而不是型別。但是當你寫:
addToStack :: State a -> a -> State a
addToStack State(Stack element) a =
State(Stack element : a)
您在說以下內容:
我想創建一個
addToStack用 type呼叫的函式State a -> a -> State a。到目前為止,一切都很好。當
addToStack使用與模式匹配的值呼叫時State (Stack element),請執行以下操作。 - 情況不妙。由于Stack是型別,而不是建構式,這沒有任何意義。這就像嘗試String通過做模式匹配f (String x) = ...。沒辦法。
您想要的是以下內容:
addToStack :: State a -> a -> State a
addToStack State(Active elements) a = ...
addToStack State(Inactive elements) a = ...
注意。Haskell 中有一種稱為雙關語的常見做法,其中建構式的名稱與其相關型別相同,不幸的是,這使得這種混淆很容易陷入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517155.html
標籤:哈斯克尔
