我知道
$ :: (a->b) -> a -> b
f $ x = f x
Run Code Online (Sandbox Code Playgroud)
直觉上,在我看来,比如说,1. $将函数的评估延迟到左边2.评估其右边的结果3.将其左边的结果输入到右边.
这对我来说非常有意义,
ghci> length $ [1..5]
5
ghci> ($) length [1..5]
5
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么,
ghci> ($ [1..5]) length
5
Run Code Online (Sandbox Code Playgroud)
从$的类型来看,是不是它的(第一个)论证应该是一个函数?
如果你想折叠一个列表,我会看到四种方法.
foldrr( - )100 [1..10] = 1 - (2 - (3 - (4 - (5 - (6 - (7 - (8 - (9 - (10 - (100)))))))) )))= 95
foldrr :: (a -> b -> b) -> b -> [a] -> b
foldrr step zero (x:xs) = step x (foldrr step zero xs)
foldrr _ zero [] = zero
Run Code Online (Sandbox Code Playgroud)
foldrl( - )100 [1..10] =(((((((((((100) - 10) - 9) - 8) - 7) - 6) - 5) - 4) …
有没有办法Data.Char从Haskell控制台查看Prelude函数列表(如),而不是访问Hoogle?
我正在阅读Haskell Prelude并发现它非常容易理解,然后我偶然发现了exponention的定义:
(^) :: (Num a, Integral b) => a -> b -> a
x ^ 0 = 1
x ^ n | n > 0 = f x (n-1) x
where f _ 0 y = y
f x n y = g x n where
g x n | even n = g (x*x) (n `quot` 2)
| otherwise = f x (n-1) (x*y)
_ ^ _ = error "Prelude.^: negative exponent"
Run Code Online (Sandbox Code Playgroud)
我不明白需要两个嵌套where的.
到目前为止我所理解的:
(^) :: …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个类似于此的函数:
withSelf :: (a -> b) -> a -> (a, b)
withSelf f x = (x, f x)
我和Hoogle一起搜索过这样的功能; 我搜索(a -> b) -> a -> (a, b)和a -> (a -> b) -> (a, b),这两者都不是决定性的.该Hackage页面上Data.Tuple没有什么我找的那么多.
我知道编写它是微不足道的,但我想在可能的情况下编写惯用的Haskell,并避免重新发明轮子.
是否有带注释的变体或Haskell Prelude可用于轻松移植调用诸如head或的函数的现有程序length?
该示例取自"基于第一原理的Haskell编程".过滤函数的目标是除去"DbDate"类型之外的所有对象.
在somone的github上,我找到了一种用列表理解和模式匹配来过滤和类型的方法(1).现在我试图找到一种方法,用lambda函数(2)或"if then"函数的正常"case"重新定义这个过滤器.当我处理自定义数据类型时,我不知道如何正确检查函数的参数类型.
本书不会向读者介绍任何超级特定的库函数,只是标准的地图,折叠,过滤器以及您在前奏中找到的其他内容.
import Data.Time
data DatabaseItem = DbString String
| DbNumber Integer
| DbDate UTCTime
deriving (Eq, Ord, Show)
--List that needs to be filtered
theDatabase :: [DatabaseItem]
theDatabase =
[ DbDate (UTCTime (fromGregorian 1911 5 1)
(secondsToDiffTime 34123))
, DbNumber 9001
, DbString "Hello, world!"
, DbDate (UTCTime (fromGregorian 1921 5 1)
(secondsToDiffTime 34123))
]
--1 works fine, found on someone's git hub
filterDbDate :: [DatabaseItem] -> [UTCTime]
filterDbDate dbes = [x | (DbDate x) <- dbes] …Run Code Online (Sandbox Code Playgroud) lambda haskell functional-programming custom-data-type haskell-prelude
我对该const功能的一个特定示例感到困惑。因此类型声明声明const :: a -> b->a该函数接受两个类型为aand 的参数b并返回一个类型a。例如:
const 5 3 => 5
const 1 2 => 1
Run Code Online (Sandbox Code Playgroud)
根据声明,这是有道理的。但是,我遇到了这个特定的例子:
const (1+) 5 3 => 4
Run Code Online (Sandbox Code Playgroud)
这让我质疑我对函数声明的理解。我知道这个函数只需要两个参数,因为我试过:
const 1 5 3
Run Code Online (Sandbox Code Playgroud)
现在这让我放心,它只需要 2 个参数。那么这是如何工作的呢?是(1+)不是参数?如果不是,那是什么?
const (1+) 5 3 => 4
Run Code Online (Sandbox Code Playgroud) 给定一个像 的函数negate,它具有类型签名:
negate :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)
我将其描述为a上下文中的类型Num(如果您认为我错了,请纠正我)。
但我不完全确定如何描述last具有类型签名的类似:
last :: [a] -> a
Run Code Online (Sandbox Code Playgroud)
我的猜测是说它不是特定于类型的,并且它需要一个列表并生成一个与列表相同类型的值。这是正确的思考方式吗?
我对另类的前奏感兴趣。我了解有很多选择:
我了解其中很多简单的问题是文本,而另一种问题是类似head错误的函数,而您可能更喜欢它们更安全。
但是,当我尝试使用这些替代方法时head,hmm中的行为似乎完全破坏了该功能,并且对我而言似乎不是一种改进。这里有些例子:
Prelude> head [1]
1
Prelude> head []
*** Exception: Prelude.head: empty list
Run Code Online (Sandbox Code Playgroud)
Foundation> head [1]
<interactive>:6:6: error:
• Couldn't match expected type ‘NonEmpty c’
with actual type ‘[Integer]’
• In the first argument of ‘head’, namely ‘[1]’
In the expression: head [1]
In an equation for ‘it’: it = head [1]
• Relevant bindings include
it :: foundation-0.0.21:Foundation.Collection.Element.Element c
(bound at <interactive>:6:1)
Foundation> head []
<interactive>:7:6: error:
• Couldn't …Run Code Online (Sandbox Code Playgroud)