在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吗?我正试着玩它,这样我就能知道它是如何工作的