簡體   English   中英

訪問自定義Haskell數據類型的函數

[英]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都需要能夠同時處理IntDouble geneState就是這種情況,因為我可以在離散值和連續值上調用geneState

讓我們分別代表消耗IntDouble代碼部分。 這兩個部分都必須是簡單的函數,所以我們可以把它們寫成

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中,函數fromIntegralInt轉換為其他數字類型。 我們可以寫

geneStateAsDouble :: Gene -> Double
geneStateAsDouble = geneState fromIntegral id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM