小编Pra*_*eek的帖子

当有fmap时,Haskell中的地图有什么意义?

无论我已经尝试使用map,fmap已工作过.为什么Haskell的创建者觉得需要一个map函数?难道它不仅仅是目前已知的fmap并且fmap可以从语言中删除吗?

haskell

92
推荐指数
3
解决办法
2万
查看次数

可折叠的一个例子,它不是一个Functor(或不是Traversable)?

一个Foldable实例可能是某种容器,因此也可能是一个容器Functor.确实,

一个Foldable类型也是一个容器(虽然类不技术上要求Functor,有趣Foldables为所有Functor为s).

那么有一个例子,Foldable它不是自然的a Functor或a Traversable?(也许Haskell维基页错过了:-))

haskell traversal functor fold

53
推荐指数
3
解决办法
4469
查看次数

为什么不能在Haskell中的实例声明中放置类型签名?

我喜欢在我的代码中为所有顶级定义添加类型签名.但是,实例声明中的类型签名似乎不被允许,如果我放置一个,我会从GHC获得"错位类型签名"错误.为什么会这样?为什么GHC不能检查类型签名是否与预期相同,如果不是,则拒绝(或警告)?

haskell instance typeclass type-signature

17
推荐指数
4
解决办法
4144
查看次数

在Haskell,àlaLYAH的不同名单上的头尾

了解一下Haskell提到差异列表(在该页面上搜索该术语),其中列表l不是直接表示而是作为函数表示(l++).这允许左右两侧更有效的连接.连接成为函数组合,最终可以转换为真实列表($[]).我想知道哪些操作可以在差异列表上有效支持.例如,(:)差异列表的等价物是

\x l -> (x:) . l
Run Code Online (Sandbox Code Playgroud)

可以有效地实施headtail差异列表吗?这是明显的实现:

headTailDifList :: ([a] -> [a]) -> (a, [a] -> [a])
headTailDifList dl = (head l, ((tail l)++))
    where
    l = dl []
Run Code Online (Sandbox Code Playgroud)

对于真实列表,\l -> (head l, tail l)以恒定时间运行.那怎么样headTailDifList?也许由于懒惰的评估只会评估第一个元素l

  1. 考虑到差异列表是一个函数而不是一个实际的"值",它甚至意味着询问它是否在恒定时间运行?
  2. 是否headTailDifList在固定时间内运行?
  3. 还有一些其他的固定时间实现吗?这是一个候选人:

    headTailDifList dl = (head (dl []), tail.dl )
    
    Run Code Online (Sandbox Code Playgroud)

    但是,如果dlid(空差异列表),尾部不会抛出异常.

haskell list lazy-evaluation

11
推荐指数
1
解决办法
694
查看次数

如何使类型成为Eq的实例

我有一个名为的数据类型Praat.我想Praat成为一个实例,Eq以便两个Praats相等,当且仅当mx它们相等时.怎么做到这一点?

-- data type
data Praat t = Praat [k] [(k,k,k,k)] 

-- praat gives the maximum frequency
Praat t -> Int
mx (Praat [] _) = 0
mx (Praat (e:es) pt) = ...........
Run Code Online (Sandbox Code Playgroud)

这就是我试图定义实例但它无法正常工作的方式.

-- I want to make Praat instance of Eq so that two Praat are equal
-- when their respective `mx` are equal
instance Eq Praat where
   mx :: (Praat k)->Int
   (mx k) == (mx k) = …
Run Code Online (Sandbox Code Playgroud)

haskell instance typeclass

11
推荐指数
1
解决办法
1万
查看次数

Haskell:仅使用列表在线性时间内反转置换

我想定义一个函数

invert :: [Int] -> [Int]
Run Code Online (Sandbox Code Playgroud)

假设其输入是一个排列[0..(n-1)],并返回其反转.可以使用列表和元组(没有数组)来定义它,以便它以线性时间运行吗?

这主要是出于学术兴趣; 在实际的代码我可能会使用ArraySTArray或相似.

haskell list permutation

8
推荐指数
1
解决办法
961
查看次数

在let-bindings中的声明顺序,Haskell vs OCaml

在Haskell中,let/where构造中的声明顺序无关紧要,例如:

f x = let g1 x y = if x>y then show x else g2 y x
          g2 p q = g1 q p
      in ...
Run Code Online (Sandbox Code Playgroud)

在声明之前g2使用的地方g1.但这不是Ocaml的情况:

# let a = b in
  let b = 5 in
  a;;
Warning 26: unused variable b.
Error: Unbound value b
Run Code Online (Sandbox Code Playgroud)

有没有理由说OCaml不像Haskell那样?在没有前瞻性声明的情况下,此功能对我来说似乎很有用.

是因为OCaml的严格评估,还是Haskell的懒惰?

ocaml haskell

6
推荐指数
3
解决办法
889
查看次数

Haskell:在线性时间内找到不在列表中的最小非负整数,仅使用列表

考虑一个函数minout :: [Int] -> Int,它接受一个不同的非负整数列表,并返回列表中不存在的最小非负整数.如果输入有重复,则函数的行为无关紧要.这可以在线性时间内实现,只使用列表(没有数组或向量或其他具有高效随机访问的数据结构)吗?

(这想出了这里.)

haskell list

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

为什么 Befunge 被认为难以编译?

Befunge 的设计目标之一是难以编译。然而,它很容易解释。可以用传统语言编写解释器,比如 C。要将 Befunge 程序翻译成等效的机器代码,可以将 Befunge 代码硬编码到 C 解释器中,并将生成的 C 程序编译为机器代码。或者“编译”是否意味着排除这种翻译的更受限制的东西?

interpreted-language compilation esoteric-languages befunge

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

Haskell:计算列表中每对相邻元素的差异

我有一个返回浮点列表的函数(mergeall).我想计算此列表中每对相邻元素的差异.例如:

[1.1,2.2,3.3,4.4,5.5,6.6]
do 1.1-2.2, 2.2-3.3,3.3-4.4...
return list of all difference
Run Code Online (Sandbox Code Playgroud)

所以,这应该传递到列表并返回一个列表.问题是:

  1. 我怎样才能使用"mergeall"中的列表?
  2. 我怎么能做上面的算法?有人能帮帮我吗?谢谢!

haskell list

2
推荐指数
1
解决办法
758
查看次数

在Haskell中,如何递归操作元组并将字符预先添加到元组中的第一个元素?

这个功能的类型是 function :: Num a => ([Char],a) -> ([Char],a)

我对此函数的输入是类似的(".'*",0),函数通过添加200或400 的值来查找第一个'.''*'更新a,a具体取决于首先替换的字符.一旦更改了某些内容,字符列表的其余部分将附加到末尾(只更改了一个字符).如果未更改头部字符,则处理列表的其余部分,但保留头部字符.

我相信前两个保护语句是正确的,但我不知道如何使这个功能递归,以检查列表中的整个字符不变.

function ([], a) = ([], a)
function ((x:xs), a)
    | x == '.' = ('-':xs, a+200)
    | x =='*' = ('-':xs, a+400)
    | otherwise = function(xs, a) --how do I put the unchanged x before xs without processing it?
Run Code Online (Sandbox Code Playgroud)

基本上,当函数到达时,我需要处理字符列表的其余部分,但是还需要返回未更改的字符.

所需输入输出的示例:

Main> function ("./-", 0)
("-/-",200)
Run Code Online (Sandbox Code Playgroud)

要么

Main> function ("-/-", 0)
("-/-",0)
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!如果不清楚,我会澄清一下.我觉得我正在以错误的方式解决这个问题.

recursion haskell tuples

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

删除3元素元组的第一个元素

有没有办法删除3元素元组的第一个元素,所以我得到一个2元素元组而不必为此目的创建另一个函数?

(A,B,C) - >(B,C)

基本上我必须使用一个函数,它创建一个3元素元组然后我必须使用一个只使用它的最后两个元素的函数.

谢谢您的回答.

haskell functional-programming tuples

1
推荐指数
2
解决办法
410
查看次数