用于确定字符串是否是回文结构的函数可以通过无点的应用方式实现
pal1 = (==) <$> reverse <*> id
Run Code Online (Sandbox Code Playgroud)
这是一个monadic版本
reverse >>= (==)
Run Code Online (Sandbox Code Playgroud)
modadic版本如何在没有显式调用id的情况下工作?我试图使用有点的方式查看指向的表示并返回相同的函数.
这可以使用x -> y可以被视为一种"读者monad" 的事实.如果我们要说
type Reader r x = r -> x
Run Code Online (Sandbox Code Playgroud)
然后我们有一个实例Monad (Reader r).所以我们可以看到
reverse :: [x] -> [x]
Run Code Online (Sandbox Code Playgroud)
实际上是
reverse :: Reader [x] [x]
Run Code Online (Sandbox Code Playgroud)
同样的,
(==) :: [x] -> [x] -> Bool
Run Code Online (Sandbox Code Playgroud)
可写成
(==) :: [x] -> Reader [x] Bool
Run Code Online (Sandbox Code Playgroud)
然后(>>=)将两者连接在一起.
所以...我们开始reverse,这是一个Reader读取列表并返回列表的动作.然后我们用它>>=来传递==,这是一个获取列表的函数,并返回一个Reader [x] Bool.
简而言之,输入列表由动作复制Reader,它基本上接受输入并将其传递给链中的每个函数.(这是读者单子什么的.)
我希望这有点意义......我花了一段时间才弄明白!
让我们来看看Monad实例((->) r):
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
Run Code Online (Sandbox Code Playgroud)
然后只需填写您的monadic代码:
reverse >>= (==) = \r -> (==) (reverse r) r
Run Code Online (Sandbox Code Playgroud)
我们可以用更熟悉的方式写出来:
\r -> reverse r == r
Run Code Online (Sandbox Code Playgroud)