你能帮我验证下面的Haskell表达式的评估:fmap(*3)(+ 5)1?我特别努力正确解析fmap xy z.
谢谢
我的试用版:
fmap (*3) (+5) 1 -- nothing to do 1 is 1
=> (fmap (*3)) (+5) 1 -- function application infixl 10
=> ((fmap (*3)) (+5)) 1 -- function application infixl 10
=> ((fmap (*3) (+5)) 1 -- (f (x) y) equivalent to (f x y)
=> ((*3) . (+5)) 1 -- fmap f g = f.g;
=> (*3) ((+5) 1) -- (f.g) x = f (g x)
=> (*3) 6
=> 18
Run Code Online (Sandbox Code Playgroud) 如何在相同参数上重写条件(提前终止)的组合?
假设我有3个条件
cond1 :: Maybe a -> Maybe a -> Maybe Bool
cond2 :: Maybe a -> Maybe a -> Maybe Bool
cond3 :: Maybe a -> Maybe a -> Maybe Bool
Run Code Online (Sandbox Code Playgroud)
和
result = cond1 x y .&& cond2 x y .&& cond3 x y
Run Code Online (Sandbox Code Playgroud)
.&&Maybe Bool的短路操作在哪里
(.&&):: Maybe Bool -> Maybe Bool -> Maybe Bool
fa .&& fb = do a <- fa; if a then fb else return False
Run Code Online (Sandbox Code Playgroud)
我正在寻找重写,result以便它采用这些条件的列表,[cond1, cond2, cond3]并连续将其应用于 …
使用$ in Learn You Haskell书中的阅读函数应用程序我找到了将$应用于函数列表的示例.
map ($ 3) [(4+), (10*), (^2), sqrt]
Run Code Online (Sandbox Code Playgroud)
我想尝试类似的东西并减少应用于一个功能的例子
fmap ($ 3) (4+)
Run Code Online (Sandbox Code Playgroud)
但我得到的错误是我不明白的
• Non type-variable argument in the constraint: Num (a -> b)
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall a b. (Num (a -> b), Num a) => (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)
你能帮我理解为什么它在第一种情况下起作用但它不在第二种情况下吗?我怎样才能达到预期的效果?
谢谢
我想检查一下map (f.g.h) x,$如果没有括号,我们是否无法重写,因为我找不到方法.
以下是我的试验:
map (f.g.h) x
-> map (f.g.h) $ x -- OK, no benefit
-> map $ f.g.h $ x -- wrong as map doesn't take one parameter
-> (map $ f.g.h) x -- Ok, no benefit, ugly :-)
Run Code Online (Sandbox Code Playgroud)
我发现只有优雅的选择才能使用
negate . sum . tail <$> [[1..5], [3..6]]]
Run Code Online (Sandbox Code Playgroud)
但我想确定我没有跳过上面的一些选项.谢谢
haskell ×4