[英]Accessing functions for custom Haskell data types
我搜索並搜索了以下內容,特別是堆棧溢出和Google。 如果它已經被覆蓋或者如此微不足道,以至於在任何地方都沒有被提及,我會道歉。
我為有時離散且有時連續的對象定義了自定義數據類型,如下所示:
data Gene = Discrete String Int | Continuous String Double
deriving (Eq, Show, Read, Ord)
這里,String表示Gene的名稱(例如vWF或其他),數值參數是其狀態,離散或連續,如下所示:
bober = Discrete "vWF" 2
slick = Continuous "gurg" 0.45432
我可以使用記錄語法來訪問Gene的屬性,但是有兩個不同的名稱和狀態函數。 我想要的是一個訪問身份的功能,一個訪問狀態的功能。 對於標識,這很簡單,因為這是兩個值構造函數的字符串:
geneName :: Gene -> String
geneName (Discrete dName _) = dName
geneName (Continuous cName _) = cName
當我嘗試創建一個返回Gene狀態的函數時,我遇到了麻煩。 我認為模式匹配會起作用:
geneState :: Num a => Gene -> a
geneState (Discrete _ dState) = dState
geneState (Continuous _ cState) = cState
這無法加載GHCi,給出:
DynamicalModularity.hs:34:35:無法匹配類型
Int' with
Double'預期類型:a實際類型:Double在表達式中:cState在`geneState'的等式中:geneState(Continuous _ cState)= cState Failed,modules已加載:無。
我嘗試使用case
語法:
geneState :: Num a => Gene -> a
geneState gene = case gene of (Discrete _ dState) -> dState
(Continuous _ cState) -> cState
再次這不加載:
DynamicalModularity.hs:30:56:無法匹配類型
Int' with
Double'預期類型:a實際類型:Double在表達式中:cState在備選案例中:(Continuous _ cState) - > cState在表達式中:case gene of {(Discrete _ dState) - > dState(Continuous _ cState) - > cState}失敗,模塊已加載:無。
我的問題是:我想做什么和/或好Haskell? 我錯過了一些明顯的東西嗎 我一直在尋找解決方案。 任何幫助將不勝感激。
任何會消耗調用geneState
結果的geneState
都需要能夠同時處理Int
和Double
geneState
就是這種情況,因為我可以在離散值和連續值上調用geneState
。
讓我們分別代表消耗Int
和Double
代碼部分。 這兩個部分都必須是簡單的函數,所以我們可以把它們寫成
intConsumer :: Int -> result
doubleConsumer :: Double -> result
現在我有這兩個部分返回相同的結果,因為消費代碼必須始終返回相同類型的事物,無論它是否接收離散或連續的Gene
。
現在,我們可以使用此信息和模式匹配編寫geneState
geneState :: (Int -> result) -> (Double -> result) -> Gene -> result
geneState intConsumer doubleConsumer (Discrete _ st) = intConsumer st
geneState intConsumer doubleConsumer (Continuous _ st) = doubleConsumer st
我們可以簡化此功能的一種方法是假設我們所有的消費者都單獨使用Double
s - 即使輸入Gene
是離散的。 這在數學上是合理的,因為Double
包含所有的Int
egers(如果你願意,可以使它更正式)。
在Haskell中,函數fromIntegral
將Int
轉換為其他數字類型。 我們可以寫
geneStateAsDouble :: Gene -> Double
geneStateAsDouble = geneState fromIntegral id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.