0

ローカル ストレージとの間で整数を読み書きしたいと考えています。

私のコードは次のようになります(これまでのところ、これをコンパイルしようとしています):

loadFromStorage = do
    mr <- getItem "budget"
    case mr of
        Left _ -> return (0 :: Integer)
        Right _ -> return (1 :: Integer)

しかし、私は得る:

No instance for (Serialize a0) arising from a use of ‘getItem’
    The type variable ‘a0’ is ambiguous
    Note: there are several potential instances:
      instance Serialize JSON -- Defined in ‘Haste.Serialize’
      instance Serialize JSString -- Defined in ‘Haste.Serialize’
      instance (Serialize a, Serialize b) => Serialize (Either a b)
        -- Defined in ‘Haste.Serialize’
      ...plus 13 others
    In a stmt of a 'do' block: mr <- getItem "budget"
    In the expression:
      do { mr <- getItem "budget";
           case mr of {
             Left _ -> return (0 :: Integer)
             Right _ -> return (1 :: Integer) } }
    In an equation for ‘loadFromStorage’:
        loadFromStorage
          = do { mr <- getItem "budget";
                 case mr of {
                   Left _ -> return (0 :: Integer)
                   Right _ -> return (1 :: Integer) } }

質問は次のとおりです。

このコードをコンパイルするにはどうすればよいですか?

整数を読み書きするにはどうすればよいですか?

4

2 に答える 2

1

使用していなくても、mrそのタイプを指定する必要があります。

のタイプを指定する 1 つの方法は、ステートメントmrを追加することです。let _ = mr :: ...

loadFromStorage = do
    mr <- getItem "budget"
    let _ = mr :: MyType
    case mr of
        Left _ -> return (0 :: Integer)
        Right _ -> return (1 :: Integer)
于 2016-07-02T14:32:43.527 に答える
0

それは今私のために働く:

toStorage :: Int -> IO ()
toStorage n = do
    setItem "page" n
    return ()

fromStorage :: IO Int
fromStorage = do
                 value <- getItem "page"
                 either (\_ -> return 0)
                        (\n -> return n)
                        value
于 2016-07-02T14:57:09.020 に答える