在函数体中使用函数类型声明中的泛型


{-# 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

最新更新