2013-04-29 2 views
3

Я действительно не могу понять синтаксис, необходимый для этого, и, вероятно, это связано с отсутствием понимания того, как работают типы.Реализация этой монады/типа в Haskell?

Я хочу тип DataPoint, который хранит либо кортеж (x, dataval) или два поля х и dataval (где х представляет собой 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) 

в принципе, «значение» монады dataval, и х является лишь частью контейнера.

Я не думаю, что мой синтаксис правильно ты GH. Если я определяю 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 `*' 

Может кто-нибудь помочь мне получить функциональность/монады Я пытаюсь для того чтобы достигнуть?

+0

Этот тип данных не может быть монадой, и, похоже, не имеет смысла, чтобы она была одной из них. Что вы пытаетесь сделать здесь? – hammar

+0

Я tr ying для хранения «dataval» вместе со значением x, связанным с ним. И затем с помощью 'DataPoint >> = f' применить' f' к 'dataval' и оставить' x' неизменным. –

+0

Это похоже на простой функтор, за исключением того, что они должны поддерживать 'dataval' любого типа, а не просто' Complex Double'. Это может иметь смысл просто определить функцию типа «fmap» для вашего типа без использования классов типов вообще. – hammar

ответ

7

С точки зрения синтаксиса, это

instance Monad (DataPoint x) where 
    -- etc 

Хотя я разделяю озабоченность Хаммар и думаю, что вы должны пытаться сделать его Functor вместо:

instance Functor (DataPoint x) where 
    -- etc 

Ошибка вид вы получаете

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

является то, что Monad и Functor являются товарными знаками th при применении к более высоким типам заказов (сравните с Monoid, класс типа, который применяется к простым типам).

например. IO Int - не Монада; IO() - не a monad; IOявляется Монада.


Я хочу тип DataPoint, который хранит либо кортеж (x, dataval) или два поля x и dataval (где x является Double и dataval является Complex Double.

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

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

Я правильно определяю свои данные/тип? –

+0

Спасибо, я думаю, что у меня это работает :) Не возражаете ли вы разобраться в различиях между функторами и монадами? Я пытаюсь понять это все еще. –

+2

Функцеры и Монады - это разные модели. Прочитайте первые несколько глав [Typeclassopedia] (http://www.haskell.org/haskellwiki/Typeclassopedia), если вы еще этого не сделали. – dave4420

Смежные вопросы