{-# LANGUAGE TemplateHaskell, DeriveGeneric, DeriveAnyClass #-}
module Main where
import Flow
import Control.Lens hiding ((|>))
import Data.Default
import GHC.Generics
main :: IO ()
main = putStrLn "hello world"
append x = (++ [x])
equals = (==)
data SectionedItems s i = SectionedItems{
_section :: Maybe s,
_items :: [i],
_subsections :: [SectionedItems s i]
} deriving (Show, Generic)
instance Default (SectionedItems s i) where
def = SectionedItems { _section = Nothing, _items = [], _subsections = [] }
makeLenses ''SectionedItems
sectionedItems = SectionedItems{
_section = Nothing,
_items = [],
_subsections = []
}
data SectionedItemsElement s i = Section s | Item i
addElementToSectionedItems :: SectionedItems s i -> SectionedItemsElement s i -> SectionedItems s i
addElementToSectionedItems si (Section x) =
(def & section .~ Just x :: SectionedItems s i) -- Error is probably somewhere here
|> subsec -> si & subsections %~ append subsec
我用什么来替换和使它工作?我试过s和I,但我在Just x
上得到了错误Could not match actual type s1 with expected type s
。我可以用什么从函数体中引用类型s和I ?
简单修复:
- 为
equals
添加类型签名-否则单态会咬你 - 删除
def & section .~ Just x
上不必要的类型注释-无论如何都会推断类型。
:
...
equals :: Eq a => a -> a -> Bool
equals = (==)
...
addElementToSectionedItems :: SectionedItems s i -> SectionedItemsElement s i -> SectionedItems s i
addElementToSectionedItems si (Section x) =
(def & section .~ Just x)
|> subsec -> si & subsections %~ append subsec