[使用DefaultSignatures时无法解析类型

问题描述 投票:0回答:1

我正在为一系列实例使用default定义。 GHC由于某些原因无法解析类型。

{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE DeriveGeneric     #-}

module Main where

import           Control.Monad.State.Strict (liftIO)
import qualified Data.Aeson                 as JSON
import qualified Data.ByteString.Lazy       as B
import           Data.Maybe
import           GHC.Generics               (Generic)

dataDir :: FilePath
dataDir = "data/"

class LoadFromFile a where
  loadFromFile :: FilePath -> IO a
  default loadFromFile :: JSON.FromJSON a => FilePath -> IO a
  loadFromFile filename = fmap (fromJust . JSON.decode) $ B.readFile ( dataDir ++ filename )

requirementsHistoryFile :: FilePath
requirementsHistoryFile = "requirementsHistory.json"

data Requirement = Contains String deriving (Show, LoadFromFile, JSON.FromJSON, Generic)
type RequirementsHistory = [Requirement]

displayRequirementsHistory :: RequirementsHistory -> IO ()
displayRequirementsHistory requirementsHistory = mapM_ (putStrLn . show) requirementsHistory

main :: IO ()
main = do
  requirementsHistory <- liftIO $ loadFromFile requirementsHistoryFile
  displayRequirementsHistory requirementsHistory

出现以下错误,原因尚不清楚:

Main.hs:31:35: error:
    • No instance for (LoadFromFile RequirementsHistory)
        arising from a use of ‘loadFromFile’
    • In the second argument of ‘($)’, namely
        ‘loadFromFile requirementsHistoryFile’
      In a stmt of a 'do' block:
        requirementsHistory <- liftIO
                                 $ loadFromFile requirementsHistoryFile
      In the expression:
        do requirementsHistory <- liftIO
                                    $ loadFromFile requirementsHistoryFile
           displayRequirementsHistory requirementsHistory
   |
31 |   requirementsHistory <- liftIO $ loadFromFile requirementsHistoryFile
   | 

任何可能会发生此错误的想法?

haskell typeclass
1个回答
0
投票

仅当您have instance声明时,默认签名才起作用,但不要选择定义方法。因此,在您的情况下,您只需要编写

instance LoadFromFile RequirementsHistory

(注意,不需要where部分,加上GHC要求您启用的任何LANGUAGE扩展名。

© www.soinside.com 2019 - 2024. All rights reserved.