1

Haskell のデータ型に少し問題があります。問題を理解するのに役立つコードを最初に投稿する必要があると思います

helper ::  (MonadMask a, MonadIO a, Functor a) => Expr -> String ->  a (Either InterpreterError Int)
helper x y = ( getEval ( mkCodeString x y ) )

-- Creates Code String
mkCodeString :: (Show a) => a -> String -> String
mkCodeString x y = unpack (replace (pack "Const ") (pack "") (replace (pack "\"") (pack "") (replace  (pack "Add") (pack y) (pack (show x) ) ) ) ) 

-- Calculates String
getEval :: (MonadMask m, MonadIO m, Functor m) => [Char] -> m (Either InterpreterError Int)
getEval str = (runInterpreter (setImports ["Prelude"] >> interpret str (as ::Int)))

-- | A test expression.
testexpression1 :: Expr
testexpression1 = 3 + (4 + 5)

-- | A test expression.
testexpression2 :: Expr
testexpression2 = (3 + 4) + 5

-- | A test expression.
testexpression3 :: Expr
testexpression3 = 2 + 5 + 5

この "helper testexpression3 "(+)" のようなヘルパー関数を使用すると、typ "Either InterpreterError Int" で値 "Right 12" が返されますが、"Int" 値 "12" のみが必要です。

関数を試しました->「getValue(Right x)= x」ですが、そのInt値を取得できません。しばらくテストした後、私が使用したモナドに問題があると思います。

ヘルパー関数の型を次のようにテストすると、次のようになります: ":t (helper testexpression1 "(+)")" 次のようになります: "(... :: (Functor a, MonadIO a, MonadMask a) => a (いずれかの InterpreterError Int)"

そのようなものをどのように機能させることができますか: "getValue (helper testexpression1 "(+)")" と書き、"12" :: Int を取得します

コードが意味をなさないことはわかっていますが、それは宿題であり、haskell でいくつかのことを試してみたかったのです。私よりも多くのアイデアがあることを願っています。

私は英語を学び始めましたが、まだ始めたばかりです。すべてのアイデアとすべてに感謝します。

編集、コードに欠けていたものは次のとおりです。

import Test.HUnit (runTestTT,Test(TestLabel,TestList),(~?))
import Data.Function (on)
import Language.Haskell.Interpreter -- Hint package 
import Data.Text
import Data.Text.Encoding
import Data.ByteString (ByteString)
import Control.Monad.Catch

-- | A very simple data type for expressions.
data Expr = Const Int | Add Expr Expr deriving Show

-- | 'Expression' is an instance of 'Num'. You will get warnings because
--   many required methods are not implemented.
instance Num Expr where
    fromInteger = Const . fromInteger
    (+) = Add

-- | Equality of 'Expr's modulo associativity.
instance Eq Expr where
    (==) x1 x2 = True --(helper x1 "(+)") ==  (helper x2 "(+)") && (helper x1 "(*)") == (helper x2 "(*)")  

その関数もファイルに含まれています...ファイルにある他のすべては、私が作成したいくつかのテストケースです。

4

1 に答える 1