我正在为一系列实例使用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
|
任何可能会发生此错误的想法?
仅当您have instance
声明时,默认签名才起作用,但不要选择定义方法。因此,在您的情况下,您只需要编写
instance LoadFromFile RequirementsHistory
(注意,不需要where
部分,加上GHC要求您启用的任何LANGUAGE
扩展名。