标签: haskell-prelude

实际上$功能在haskell中做了什么?

我知道

$ :: (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)

从$的类型来看,是不是它的(第一个)论证应该是一个函数?

syntax haskell operators dollar-sign haskell-prelude

9
推荐指数
3
解决办法
445
查看次数

丢失的折叠

如果你想折叠一个列表,我会看到四种方法.

从列表右侧折叠,右侧是递归项

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) …

recursion language-features haskell fold haskell-prelude

9
推荐指数
1
解决办法
405
查看次数

有没有办法从Haskell控制台查看Prelude函数列表?

有没有办法Data.Char从Haskell控制台查看Prelude函数列表(如),而不是访问Hoogle?

haskell ghci haskell-prelude

7
推荐指数
1
解决办法
367
查看次数

前奏词取幂很难理解

我正在阅读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)

haskell functional-programming haskell-prelude

7
推荐指数
2
解决办法
259
查看次数

Prelude中是否有一个函数将值与应用于函数的值配对?

我正在寻找一个类似于此的函数:

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 haskell-prelude

6
推荐指数
2
解决办法
108
查看次数

是否有启用Liquid Haskell的Prelude?

是否有带注释的变体或Haskell Prelude可用于轻松移植调用诸如head或的函数的现有程序length

haskell liquid-haskell haskell-prelude

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

如何定义一个lambda函数,根据sum类型的子类型过滤列表?

该示例取自"基于第一原理的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

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

Haskell 中的 const 函数声明

我对该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)

haskell function-declaration haskell-prelude

4
推荐指数
1
解决办法
142
查看次数

描述非类型特定的 Haskell 函数的类型签名的方法是什么?

给定一个像 的函数negate,它具有类型签名:

negate :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)

我将其描述为a上下文中的类型Num(如果您认为我错了,请纠正我)。

但我不完全确定如何描述last具有类型签名的类似:

last :: [a] -> a
Run Code Online (Sandbox Code Playgroud)

我的猜测是说它不是特定于类型的,并且它需要一个列表并生成一个与列表相同类型的值。这是正确的思考方式吗?

haskell types function type-signature haskell-prelude

4
推荐指数
1
解决办法
95
查看次数

在Haskell中使用替代前奏

我对另类的前奏感兴趣。我了解有很多选择:

  1. https://hackage.haskell.org/packages/#cat:前奏
  2. https://guide.aelve.com/haskell/alternative-preludes-zr69k1hc

我了解其中很多简单的问题是文本,而另一种问题是类似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)

haskell haskell-prelude

3
推荐指数
1
解决办法
266
查看次数