在haskell中使用函子

在haskell中使用函子,haskell,functor,Haskell,Functor,我有一个定义如下的世界数据类型: data World = World { resolution :: (Int, Int) , direction :: Snake_direction , snake_scale :: Int , snake :: [(Int, Int)] , isStuck :: Bool , gen :: R.StdGen , food :: (Int, Int) , superFood :: (I

我有一个定义如下的世界数据类型:

     data World = World
    { resolution :: (Int, Int)
    , direction :: Snake_direction
    , snake_scale :: Int
    , snake :: [(Int, Int)]
    , isStuck :: Bool
    , gen :: R.StdGen
    , food :: (Int, Int)
    , superFood :: (Int, Int)
    } deriving (Read, Show) 
我想使用一个函子,它在snake列表上使用fmap,这是一个世界数据类型的参数。我正在努力学习函子语法

instance Functor (World) where
    fmap f (World) = World {fmap f snake}
但是编译器说

error: parse error on input ‘f’
如果我们检查函子类型类,我们会看到:

class Functor (f :: * -> *) where
  fmap :: (a -> b) -> f a -> f b
  (<$) :: a -> f b -> f a
  {-# MINIMAL fmap #-}
然后我们可以定义一个fmap,如下所示:

instance Functor World where
    fmap f w = w {snake = fmap (\(x,y) -> (f x, f y)) (snake w)}
instance Functor World where
    fmap f w = w {snake = f (snake w)}
然后我们可以定义一个fmap,如下所示:

instance Functor World where
    fmap f w = w {snake = fmap (\(x,y) -> (f x, f y)) (snake w)}
instance Functor World where
    fmap f w = w {snake = f (snake w)}
如果我们检查函子类型类,我们会看到:

class Functor (f :: * -> *) where
  fmap :: (a -> b) -> f a -> f b
  (<$) :: a -> f b -> f a
  {-# MINIMAL fmap #-}
然后我们可以定义一个fmap,如下所示:

instance Functor World where
    fmap f w = w {snake = fmap (\(x,y) -> (f x, f y)) (snake w)}
instance Functor World where
    fmap f w = w {snake = f (snake w)}
然后我们可以定义一个fmap,如下所示:

instance Functor World where
    fmap f w = w {snake = fmap (\(x,y) -> (f x, f y)) (snake w)}
instance Functor World where
    fmap f w = w {snake = f (snake w)}
另一个选择是不要让世界成为一个函子,因为你们真正想要的是一种将函数映射到一个世界值上的方法

另一个选择是不要让世界成为一个函子,因为你们真正想要的是一种将函数映射到一个世界值上的方法


函子要求世界应该是高阶类型,因此数据世界A=。。。。这里的情况并非如此。此外,你打算如何处理fmap f snake,fmap over the snake?是的,我想fmap over the snake,但正如所说的,这只适用于世界是高阶类型的情况,类型应该是*->*。单子也适用于世界是高阶类型的情况吗?是的,函子,单子,函子要求世界应该是高阶类型,所以数据世界A=。。。。这里的情况并非如此。此外,你打算如何处理fmap f snake,fmap over the snake?是的,我想fmap over the snake,但正如所说的,这只适用于世界是高阶类型的情况,类型应该是*->*。单子也适用于世界是高阶类型的情况吗?是的,函子,单子,和应用程序。这是这里的自然解决方案。听起来世界并不是一个真正的函子,你只想映射它的一个成员。也许还值得一提的是,这是一个光学的特例,因此可以由镜头库自动生成。我怀疑是这样的,但我对它们的了解还不够,所以我还没有把它说清楚。这是自然的解决办法。这听起来不像是一个真正的函子,你只想映射它的一个成员。也许还值得一提的是,这是一个光学的特殊情况,因此可以由镜头库自动生成。我怀疑是这样的,但我对它们的了解还不够,无法将其表达出来。非常感谢!你能给我举个例子,说明我如何在数据世界中使用Applicative和Monad吗?我正试着玩它,这样我就能知道它是如何工作的。非常感谢!你能给我举个例子,说明我如何在数据世界中使用Applicative和Monad吗?我正试着玩它,这样我就能知道它是如何工作的