我是 Haskell 的新手,有一些關于將函式 say f應用于網格的每個元素的問題。
網格型別:
data Grid a = Grid [[a]] deriving (Show, Eq)
gridG :: Grid a -> [[a]]
功能定義:
mapGrid :: (a -> b) -> Grid a -> Grid b
我該怎么做呢?讓我失望的是網格由串列串列組成。通常,您可以只應用 map 函式,但會引發意外的型別錯誤。
例如:
mapGrid :: (a -> b) -> Grid a -> Grid b
mapGrid f (Grid g) = map f g
它拋出預期型別的??網格 b 與實際型別 [b]
uj5u.com熱心網友回復:
您可以在網格中展開串列串列,然后應用map (map f)這些串列,因此:
mapGrid :: (a -> b) -> Grid a -> Grid b
mapGrid f (Grid xs) = Grid (map (map f) xs)
實際上,第一個map將映射到您的網格的“行”,并且作為函式,它將執行map f這將應用于f該行的所有專案。
然而,您不需要自己實作這樣的映射:通過使用DeriveFunctor擴展,您可以讓 Haskell 實作一個函子實體:
{-# LANGUAGE DeriveFunctor #-}
data Grid a = Grid [[a]] deriving (Eq, Functor, Show)
現在您可以使用fmap :: Functor f => (a -> b) -> f a -> f b. 對于 a,Grid您可以使用它fmap (1 ) (Grid [[1,4], [2,5]])來f對Grid.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/351370.html
標籤:哈斯克尔
