2016-05-05 8 views
0

私は、次のタイプがあります。場合 - 試合だけ同じ値

(MI _, MI _) -> "ok, these are the same value" 
(MI _, MD _) -> "fail, first is MI, and second is MD" 

はどのようにそれを行うには:今

MyData = MI Integer | MD Double | MC Char. 

は、私ができるようにしたい事、次のですか?あなたが思うように、私はあまりにも多くの場合を書いてほしくはありません... あなたは私に何か方法をお勧めできますか?項目(例えばIntegerすることができる)とタイプを比較

+2

WHAあなたの問題は、関数定義でこれを囲む必要があるだけです( '=' not ' - >'を使うことを覚えておいて、型シグネチャを書くことから始めること、そしておそらくは '' lyah' '(http:// learnyouahaskell .com)あなたに同意します – epsilonhalbe

+0

btw - あなたの型定義が間違っています - あなたはその行の前に 'data'を置く必要があります。 – epsilonhalbe

答えて

1

純粋」ハスケル(つまり等、多くの言語拡張なしで)最初< MyDataTypeMyDataをマッピングすることであろう>溶液。利点は、タイプに対して他の比較を実行できることです。たとえば:

import Data.Function(on) 

data MyData = MI Integer | MD Double | MC Char 

myDataType :: MyData -> Integer 
myDataType (MI _) = 0 
myDataType (MD _) = 1 
myDataType (MC _) = 2 

areEqualTypes :: (MyData,MyData) -> Bool 
areEqualTypes (a,b) = (==) `on` myDataType 

altoughは、この場合のために多くの付加価値はありませんあなたが後で2種類が等しいかどうか3のタプルをチェックしたい場合、それはより少ないコードになります。たとえば:

atLeastOneEqualType :: (MyData,MyData,MyData) -> Bool 
atLeastOneEqualType (a,b,c) = ta == tb || ta == tc || tb == tc 
    where ta = myDataType a 
      tb = myDataType b 
      tc = myDataType c 
1

もう一つの方法は、結果の型としてEither String xを使用するために、障害の概念と計算を実現しています。今、このため

この場合

機能

data MyData = MI Integer | MD Double | MC Char 
      deriving (Show) 

equivalence :: MyData -> MyData -> Either String Bool 
equivalence (MI _) (MI _) = Right True 
equivalence (MD _) (MD _) = Right True 
equivalence (MC _) (MC _) = Right True 
equivalence a  b  = Left $ "Type mismatch: " ++ show (a,b) 

おそらく最も簡単で最も簡単な方法ではなく、つまらないされているが、将来のバージョンでは

equivalence :: MyData -> MyData -> Either String Bool 
equivalence (MI a) (MI b) = Right $ a == b 
equivalence (MD a) (MD b) = Right $ a == b 
equivalence (MC a) (MC b) = Right $ a == b 
equivalence  a  b = Left $ "Type mismatch: " ++ show (a,b) 
1

することができ、あなただけの4つの条件を記述する必要があります

equalType :: (MyData, MyData) -> Bool 
equalType (MC _, MC _) = True 
equalType (MI _, MI _) = True 
equalType (MD _, MD _) = True 
equalType _ = False 
-1
cname_MyData :: MyData -> String 
cname_MyData (MI _) = "MI" 
cname_MyData (MD _) = "MD"  
cname_MyData (MC _) = "MC" 

doThing :: MyData -> MyData -> Either String a 
doThing (MI i1) (MI i2) = Right (...) 
doThing (MD d1) (MD d2) = Right (...) 
doThing (MC c1) (MC c2) = Right (...) 
doThing x1 x2 = Leftt ("Tried to doThing with " ++ 
     cname_MyData x1 ++" and " ++ cname_MyData x2) 
関連する問題