我相信我对fmap . fmapFunctors 了解,但是在功能方面它已经让我头疼了好几个月了.
我已经看到你可以只应用(.)to 的定义(.) . (.),但我忘了怎么做.
当我自己尝试时,它总是错误的:
(.) f g = \x -> f (g x)
(.) (.) (.) = \x -> (.) ((.) x)
\x f -> (.) ((.) x) f
\x f y -> (((.)(f y)) x)
\x f y g-> (((.)(f y) g) x)
\x f y g-> ((f (g y)) x)
\x f y g-> ((f (g y)) x):: t2 -> (t1 -> t2 -> t) -> t3 …Run Code Online (Sandbox Code Playgroud) 当我有类似的功能
f :: (Ord a) => a -> a -> Bool
f a b = a > b
Run Code Online (Sandbox Code Playgroud)
我想用make函数包装这个函数.
例如,使这样的功能
g :: (Ord a) => a -> a -> Bool
g a b = not $ f a b
Run Code Online (Sandbox Code Playgroud)
我可以像组合一样组合
n f = (\a -> \b -> not $ f a b)
Run Code Online (Sandbox Code Playgroud)
但我不知道怎么做.
*Main> let n f = (\a -> \b -> not $ f a b)
n :: (t -> t1 -> Bool) -> t -> t1 -> Bool …Run Code Online (Sandbox Code Playgroud) 我在Haskell中有以下功能
agreeLen :: (Eq a) => [a] -> [a] -> Int
agreeLen x y = length $ takeWhile (\(a,b) -> a == b) (zip x y)
Run Code Online (Sandbox Code Playgroud)
我正在努力学习如何编写'惯用'Haskell,它似乎更喜欢使用.而$不是括号,并且在可能的情况下更喜欢无点代码.我似乎无法摆脱提及x和y明确.有任何想法吗?
我认为我对点两个参数的任何函数都有同样的问题.
顺便说一下,这只是为了编写好的代码; 不是一些"使用任何必要的东西来使其无意义"的家庭作业.
谢谢.
(添加评论)感谢您的回答.你已经说服我这个功能不会从pointfree中受益.而且你也给了我一些很好的例子来练习转换表达式.这对我来说仍然很困难,而且它们似乎与Haskell一样重要,因为它指向C.
如何结合使用$和无点风格?
一个明显的例子是以下效用函数:
times :: Int -> [a] -> [a]
times n xs = concat $ replicate n xs
Run Code Online (Sandbox Code Playgroud)
只是写入concat $ replicate产生错误,类似的是你不能写concat . replicate,因为concat期望值而不是函数.
那么你如何将上述功能转变为无点风格呢?
我不明白使用arity> 1编写函数.在ghci 7.4.1我输入:
((*).succ) 3 4
> 16
Run Code Online (Sandbox Code Playgroud)
我并不完全理解数学变换,但很明显它与数学变换相同
(*) (succ 3) 4
Run Code Online (Sandbox Code Playgroud)
但当我这样做时:
( (\x y z -> x).(\a b -> a*b) ) 2 3 4 5
> 10
( (\x y z -> y).(\a b -> a*b) ) 2 3 4 5
> No instance for (Num (a0 -> t0))
Run Code Online (Sandbox Code Playgroud)
现在我完全迷失了.有人能解释会发生什么吗?PS.我知道haskell中的所有内容只有1个参数,但它并没有真正帮助我:)
我试图用类型(Floating a) => a -> a -> a的函数组成一个类型的函数(Floating a) => a -> a来获得类型的函数(Floating a) => a -> a -> a.我有以下代码:
test1 :: (Floating a) => a -> a -> a
test1 x y = x
test2 :: (Floating a) => a -> a
test2 x = x
testBoth :: (Floating a) => a -> a -> a
testBoth = test2 . test1
--testBoth x y = test2 (test1 x y)
Run Code Online (Sandbox Code Playgroud)
但是,当我在GHCI中编译它时,我收到以下错误:
/path/test.hs:8:11:
Could not …Run Code Online (Sandbox Code Playgroud) 我正在尝试移植以下 Haskell 代码(http://codepad.org/MMydRCxo)
foo :: Int -> Int -> Int -> Maybe Bool
foo a b c = if a == 1 then Just True else Nothing
bar :: Int -> Int -> Bool
bar b c = maybe False id $ foo 1 b c
-- point free
bar' :: Int -> Int -> Bool
bar' = ((maybe False id $) .) . foo 1
main = do
print $ bar 2 3
print $ bar' 2 …Run Code Online (Sandbox Code Playgroud) 你能解释一下下面的表达式是如何工作的:
str a b = ((.).(.)) (0 -) (+) 1 2
Run Code Online (Sandbox Code Playgroud)
我检查了它,GHCi说它是,-3但我不明白为什么.
我还检查了以下内容:
*Main> :t ((.).(.))
((.).(.)) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c
Run Code Online (Sandbox Code Playgroud)
但它对我没有帮助.
任何的想法?