我知道点 (.) 运算符被定义为采用三个参数(两个函数和一个类型为“a”的值),并且通过将参数应用于右侧的函数和左侧的函数来工作应用于左侧应用程序的输出,如下所示:
-- Associativity: infixr 9
(.) :: (b -> c) -> (a -> b) -> a -> c
(f . g) x = f(g x)
-- Or in another format
f . g = \x -> f(g x)
Run Code Online (Sandbox Code Playgroud)
现在,这就是在函数组合中使用点运算符的多个应用程序令人困惑的地方,请考虑这一点:
对于像 (+) 这样的中缀运算符,它采用“Num”类中类型的两个参数。
(+) :: Num a => a -> a -> a
-- An application would look like this:
> 4 + 3
7
-- With more applications composed with (+)
> 4 + 3 + 2
9 …
Run Code Online (Sandbox Code Playgroud) 我在GHCi中写了一个快速的单行程,并尝试用地图组合总和.我认为它失败的原因是因为map给出了一般类型[b]的输出,而sum则采用特定输入Num a => [a].但是,假设map函数的输出类型为Num b => [b],则此代码没有任何问题.
我认为写一个限制类型声明可能会起作用(虽然我猜这会阻止你在GHCi中这样做)但它仍然没有:
myFunc :: Num b => (a -> b) -> [a] -> b
myFunc = sum . map
Run Code Online (Sandbox Code Playgroud)
给我以下错误:
Couldn't match expected type `[[a] -> b]'
with actual type `[a] -> [b]'
Expected type: (a -> b) -> [[a] -> b]
Actual type: (a -> b) -> [a] -> [b]
In the second argument of `(.)', namely `map'
In the expression: sum . map
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?也许我只是缺少一些明显的东西(Haskell新手).
我想创建三个Haskell函数:a
,b
,和c
.
每个函数都有一个参数.这个论点是三个函数之一.
我想函数a
有这种行为:
a
则返回函数a
.b
.a
.这里是我想要的功能回顾a
:
a a = a
a b = c
a c = a
Run Code Online (Sandbox Code Playgroud)
这是我希望其他两个功能的行为:
b a = a
b b = a
b c = c
c a = c
c b = b
c c = c
Run Code Online (Sandbox Code Playgroud)
一旦创建,我希望能够以各种方式组合函数,例如:
a (c b)
= a (b)
= c
Run Code Online (Sandbox Code Playgroud)
我该如何创建这些功能?
haskell functional-programming function function-composition higher-order-functions
有人可以告诉我为什么在这个功能中使用"." ?
longestProductLen :: [(Barcode, Item)] -> Int
longestProductLen = maximum . map (length . fst . snd)
Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手,我试图在列表上执行一些递归函数,并且在递归完成后,我想从递归中访问输出列表以执行其他操作.
例如,下面的函数接受一个值来保存和列表,它返回一个列表,其中只包含要保留的值,丢弃所有其他值.
我想做的是理解在递归发生后我如何能够访问输出列表,所以我可以继续操作它.
就像是:
//recursive function here
//get length of output list from recursive function
length list
Run Code Online (Sandbox Code Playgroud)
我的功能
keepAll _ [] = []
keepAll y (x:xs) | x==y = y:keepAll y xs
| otherwise = keepAll y xs
Run Code Online (Sandbox Code Playgroud)
提前谢谢了!
关于点运算符,我有点困惑.我有以下代码(用于测试):
test :: Int -> Int -> Int
test x y = f1 . f2 x y
where f1 n = n+1
f2 x' y' = x' * y'
Run Code Online (Sandbox Code Playgroud)
我认为它将首先执行(f2 xy),然后在该结果上执行f1,但它会抛出错误.谁能告诉我点运算符的确切定义以及等于f1的内容.f2 xy?(在没有点运算符的情况下编写)
最好的问候,Skyfe.
编辑:如果点运算符产生一个完整的新函数,我认为以下代码应该工作:
test :: Int -> Int -> Int
test x y = f1 . f2 x
where f1 n = n+1
f2 x' y' = x' + y'
Run Code Online (Sandbox Code Playgroud)
但是该代码也会返回错误.
有时需要在一个命令中进行多次调用.一个简单的例子可能是strrep.假设您要用括号替换所有括号,所有逗号用点替换,然后删除所有双引号.然后可能需要以下伪代码:
strrep(myString, '()', '[]', ',', '.', '"', '')
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?你当然可以选择:
strrep(strrep(strrep(myString, '()', '[]'), ',', '.'), '"', '')
Run Code Online (Sandbox Code Playgroud)
或者将字符串保存在单元格数组中并在for循环中使用它,但这两种解决方案都非常难看.
最理想的答案是对所有以类似方式工作的函数都是通用的.
当我们有表达式时:
(fmap . fmap) function nested_functor
Run Code Online (Sandbox Code Playgroud)
我希望它能翻译成类似的东西
fmap (fmap function nested_functor)
Run Code Online (Sandbox Code Playgroud)
虽然它出人意料地表现得像
fmap (fmap function) nested_functor
Run Code Online (Sandbox Code Playgroud)
为什么?
我花了很长时间没有编程Haskell,并决定通过采用一个相对先进的项目回到它.我正在尝试按照本指南从头开始编程神经网络.我已经摸索了一些他最神秘的方法来解决诸如创建权重和偏见网络之类的简单问题,但是当涉及到这个时:
feed :: [Float] -> [([Float], [[Float]])] -> [Float]
feed input brain = foldl' (((relu <$>) . ) . zLayer) input brain
Run Code Online (Sandbox Code Playgroud)
我不明白他做了什么.更具体地说,我不明白为什么.
在这里使用函数组合中的两个.他使用(relu <$>) . )
.这.
后面的括号对我来说没有意义.我理解它代表函数组合,在这种情况下,函数zLayer接受一层神经元,它是类型([Float], [[Float]])
和前一层的输出,它是类型[Float]
,并产生一个新的输出,也是类型[Float]
.我理解他正在将relu <$>
函数应用于结果zLayer
,这是有道理的.也就是说,你想要通过在大脑层上应用来折叠大脑(这只是一个层列表)zLayer
,然后应用relu <$>
其结果,最后将其作为input
下一层传递.
看似空洞的构图是我的错.对我来说,上面描述的内容应该像这样实现:
feed :: [Float] -> [([Float], [[Float]])] -> [Float]
feed inp brain = foldl' (((sigmoid <$>) . computeLayer) inp brain
Run Code Online (Sandbox Code Playgroud)
(我使用的是sigmoid函数而不是整流器(ReLU),而computeLayer只是我对zLayer的实现.)对吗?我在那里做的是(据说)提供,作为一个功能foldl'
,这:
(sigmoid <$> (computeLayer))
Run Code Online (Sandbox Code Playgroud)
当我 …
haskell functional-programming purely-functional neural-network function-composition
lines
Haskell中的函数将字符串的行分成字符串列表:
lines :: String -> [String]
Run Code Online (Sandbox Code Playgroud)
该readFile
函数将文件读取为字符串:
readFile :: FilePath -> IO String
Run Code Online (Sandbox Code Playgroud)
尝试组合这些函数以获取文件中的行列表会导致类型错误:
Prelude> (lines . readFile) "quux.txt"
<interactive>:26:10: error:
• Couldn't match type ‘IO String’ with ‘[Char]’
Expected type: FilePath -> String
Actual type: FilePath -> IO String
• In the second argument of ‘(.)’, namely ‘readFile’
In the expression: lines . readFile
In the expression: (lines . readFile) "quux.txt"
Run Code Online (Sandbox Code Playgroud)
我该怎么做单子戏?