相关疑难解决方法(0)

我怎么能理解"(.).(.)"?

我相信我对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)

haskell functional-programming pointfree

33
推荐指数
3
解决办法
2141
查看次数

如何用任意arity函数组合`not`?

当我有类似的功能

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 functional-programming function composition

31
推荐指数
4
解决办法
5659
查看次数

如何将两个参数的Haskell函数重写为无点样式

我在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,它似乎更喜欢使用.$不是括号,并且在可能的情况下更喜欢无点代码.我似乎无法摆脱提及xy明确.有任何想法吗?

我认为我对点两个参数的任何函数都有同样的问题.

顺便说一下,这只是为了编写好的代码; 不是一些"使用任何必要的东西来使其无意义"的家庭作业.

谢谢.


(添加评论)感谢您的回答.你已经说服我这个功能不会从pointfree中受益.而且你也给了我一些很好的例子来练习转换表达式.这对我来说仍然很困难,而且它们似乎与Haskell一样重要,因为它指向C.

haskell pointfree

25
推荐指数
2
解决办法
5189
查看次数

无点风格并使用$

如何结合使用$和无点风格?

一个明显的例子是以下效用函数:

times :: Int -> [a] -> [a]
times n xs = concat $ replicate n xs  
Run Code Online (Sandbox Code Playgroud)

只是写入concat $ replicate产生错误,类似的是你不能写concat . replicate,因为concat期望值而不是函数.

那么你如何将上述功能转变为无点风格呢?

haskell pointfree

10
推荐指数
3
解决办法
578
查看次数

组成更高的功能

我不明白使用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个参数,但它并没有真正帮助我:)

haskell functional-programming higher-order-functions

10
推荐指数
2
解决办法
780
查看次数

Haskell:使用两个浮动参数的组合函数失败

我试图用类型(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 function-composition

6
推荐指数
1
解决办法
1100
查看次数

具有多个函数参数的点自由符号

我正在尝试移植以下 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)

pointfree elm

5
推荐指数
1
解决办法
944
查看次数

表达式的评估str ab =((.).(.))(0 - )(+)1 2

你能解释一下下面的表达式是如何工作的:

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)

但它对我没有帮助.

任何的想法?

haskell pointfree

4
推荐指数
3
解决办法
312
查看次数