簡體   English   中英

在Haskell中實現這個monad /類型?

[英]Implementing this monad/type in Haskell?

我真的無法弄清楚這需要的語法,它可能來自我對類型如何工作的缺乏理解。

我想要一個類型DataPoint ,它存儲元組(x, dataval)或兩個字段x和dataval(其中x是Double ,dataval是Complex Double

我想要一個Monad實例,其中包括:

instance Monad (DataPoint x dataval) where
    return dataval = DataPoint 0.0 dataval
    DataPoint x dataval >>= f = DataPoint x (f dataval)

基本上,monad的“值”是dataval,而x只是容器的一部分。

我不認為我的語法是正確的。 如果我將DataPoint定義為

data DataPoint x dataval = DataPoint { x       :: Double
                                     , dataval :: Complex Double }

它應該工作,對嗎?

只有我得到“善意的不匹配”

The first argument of `Monad' should have kind `* -> *',
but `DataPoint x dataval' has kind `*'

任何人都可以幫助我獲得我想要實現的功能/ monad嗎?

在語法方面,它是

instance Monad (DataPoint x) where
    -- etc

雖然我分享了hammar的擔憂,並認為你應該嘗試將它變成Functor:

instance Functor (DataPoint x) where
    -- etc

你得到的那種錯誤

The first argument of `Monad' should have kind `* -> *',
but `DataPoint x dataval' has kind `*'

是因為MonadFunctor是適用於更高階類型的類型類(與Monoid ,這是一個適用於簡單類型的類型類)。

例如IO Int 不是 monad; IO () 不是 monad; IO 一個monad。


我想要一個類型DataPoint ,它存儲元組(x, dataval)或兩個字段xdataval (其中xDoubledatavalComplex Double

data DataPoint a = DataPoint {x :: Double,
                              dataval :: a}

instance Functor DataPoint where
    fmap f dataPoint = DataPoint {x = x dataPoint,
                                  dataval = f (dataval dataPoint)}

暫無
暫無

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

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