你如何在Applicative类型类中发音这些函数:
(<*>) :: f (a -> b) -> f a -> f b
(*>)  :: f a -> f b -> f b
(<*)  :: f a -> f b -> f a
(也就是说,如果他们不是运营商,他们会被称为什么?)
作为旁注,如果你可以重命名pure为对非数学家更友好的东西,你会怎么称呼它?
在学习Haskell时,我发现这个问题的答案非常有用,因为它将概念与运算符联系起来:常见的Haskell运算符是否有明显的名称?
scalaz有一个等价的字典吗?或者有人可以帮助提供有关他们如何发音自己的scalaz代码的建议?
尽管有一些Lisp和ML的经验,但我在学习阅读和(惯用)编写Haskell时遇到了很多麻烦,因为本地风格似乎是
最后一个特别困难,因为有很多预定义的运算符,每个运算符都有自己的约定和一般语义,经常阅读Haskell成为Hoogle和:type.
是否有任何好的教程假设CS /功能概念的知识,而是专注于Haskell特定的习语?我正在寻找类似Real-World Haskell的东西,它以一个非常幼稚,明确的程序开始,然后逐渐将其转换为更惯用的风格,介绍和解释成语.但是它不是引入和解释像monad和类类这样的一般概念,而是引入特定的monad和特定的类型类,比如"但这正是Alternative monoid所做的!"
我遇到了一些我需要列表的情况:
[(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)] -- no (0,0)
请注意,列表中没有(0,0).我使用(dx,dy)元组从坐标向上,向下,向左,向右和对角搜索.
每次我写它时,我觉得应该有一个更简洁,和/或更容易阅读的方式来定义它.我对Haskell比较陌生,而且我认为在Applicative/Functor/Monad技巧的某个地方应该有一个巧妙的方法来做到这一点.
我试过了:
[(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)]
有时最好把它写出来,但我认为这不是其中之一.一目了然(0,0)不包括在内并且你必须阅读它以注意模式.
map (\[a,b] -> (a,b)) $ delete [0,0] $ sequence $ replicate 2 [-1,0,1]
我喜欢上面的那个,因为我把"2"放在那里,这是一个很好的明确方式来说"我们两次做同样的事情",但我不能接受前面的地图与大不安全的lambda和2个名字.
[(dx,dy) | let a = [-1,0,1], dx <- a, dy <- a, (dx,dy) /= (0, 0)]
这个名称中包含太多名称,但完全按照设计使用列表推导.对于那些真正喜欢列表推导的人来说,可能更容易阅读,但我不喜欢所有的名字.
let x = [-1,0,1] in delete (0,0) $ (,) <$> x <*> x
那个看起来更漂亮的imo,但我没有那个"2",我有一个名字.到目前为止,这是我的最爱,但它并不完美.
我想如果我理解如何更好地写这个,我可能会更深入地了解Functors/Monads等.我已经读了很多关于它们的内容,我听过很多像fmap/mconcat/etc这样的词,但我不知道在这种情况下要抓哪一个.
我最近一直在使用应用程序(和替代方案),令我感到沮丧的一件事是我缺乏对命名法的了解.作为一个例子,我希望能说function name的,而不是star thing为<*>.因此,与>>=读取的方式大致相同bind,以下是否有更多人性化的名称:
<*> - 申请?<*&*>- 左右适用?<$> -  fmap?<|>同样来自箭头
*** - 分裂?&&& - 扇出?如果有这些名称,我的搜索没有发现它们.我知道这些可能没有被接受的条款,但如果有,我很想知道它们.
我已经和Haskell一起玩了好几年了; 我对monad如何工作,如何使用它们以及操作员(=<<)和(>>=)做什么感到很满意.
但我还是不知道如何谈论它们!对于他们的工作是否有任何标准术语 - 将箭头a -> m b转换为箭头的动作m a -> m b?
(作为背景的数学家,脑海中浮现的一个选项是"来自Kleisli类别的遗忘函子".但是Haskell大师肯定会有一些更简洁的术语,因为在Haskell中,这个操作被用作其中一个构建块. monads,与通常被认为是派生操作的数学设置不同,从乘法和functoriality定义!)
Prelude> (fmap . const ) 2 Just 3
2
Prelude> 2 <$ Just 3
Just 2
Prelude> :t (<$)
(<$) :: Functor f => a -> f b -> f a
Prelude> :t fmap . const
fmap . const :: Functor f => b -> f a -> f b
在仿函数中,
(<$)        =  fmap . const   
为什么我为Maybe得到不同的结果?没找到<$在Maybe中的工具.谢谢.
可能重复:
常见的Haskell运算符是否有明显的名称?
你怎么说<$>和<*>英语.我明白这<$>只是fmap,所以它被称为?
你会如何大声朗读这些片段?
ghci> (:) <$>  Just 3 <*> Just [4]
ghci> Just (+3) <*> Just 9  
根据我在这里收到的建议,我试图在没有无关的绑定分配的情况下重写函数并返回,但是我遇到了额外的IO,我似乎无法理解如何摆脱它.
我有
good :: IO (Either Int String)
getit :: Either Int String -> Int
main :: IO ()
main = do
  x <- fmap getit good
  putStrLn $ show x
主要工作正常.但....
main2 :: IO ()
main2 = do
  putStrLn $ show $ fmap getit good
-- let's try totally without do
main3 :: IO ()
main3 = putStrLn $ fmap show $ fmap getit good
main2失败了:
• No instance for (Show (IO Int)) arising from a use …