在大多数功能语言(包括Haskell )中,定义链接列表类型本身是简单的:
data List a = Nil | Cons a (List a)
但是,我在Haskell教程中找不到显示如何定义自己的数组类型的教程。如何定义数组数据类型,就像我们从无到有地定义自己的列表一样?
Note:我的问题不是如何在Haskell中使用数组,而是理论上如何定义自己的数组类型,就像为List所做的那样,而不使用任何类型的库或内置功能。
在Haskell中,如何有效地将无限列表的最后一项与有限列表连接起来?
last不工作,它显然是从头部迭代的,因此以下内容永远不会完成:
-- let's have a list of all natural numbers,
-- with zero appended
arr = [1..] ++ [0]
-- it was fast! now get the last item, should be easy
res = last arr
编辑:我想知道Haskell对[1..] ++ [0]的内部表示是什么,最初是“完全未评估”吗?如果它将内部表示为由两个(未评估的)列表组成的“
作为一项培训,我编写了一个多态函数,以确定给定的数字是否是单个数字或所有数字列表的素数:
{-# LANGUAGE FlexibleInstances #-}
class PrimeTo a where
ispt :: Integer -> a -> Bool
instance PrimeTo (Integer) where
ispt n d = 0 /= (rem n d)
instance PrimeTo ([Integer]) where
ispt n [] = True
ispt n (x:xs) = (ispt n x) &&
我正在学习Haskell。
我正在尝试查找列表as的元素,这些元素与列表bs的元素相加,并以元组的形式返回这些元素:
findSum2 :: [Int] -> [Int] -> [(Int,Int,Int)]
findSum2 as bs = [(a, a', b) | a <- as, a' <- as, b <- bs, a + a' == b]
代码起作用了。但为了学习Haskell,我尝试将其重写为do-notation:
findSum2 :: [Int] -> [Int] -> [(Int,Int,Int)]
fin
嗨,我是Haskell编程的新手。我正在尝试自己实现运算符"++“。下面是我编写的一个小程序,但它无法工作:
append (es:e) xs =
if (null es)
then e:xs
else append es (e:xs)
我收到了许多与a,[a]和[a]的类型错误。Haskell中的列表类型仍然令人困惑。有人能帮我吗?谢谢。:)
在学习haskell时,我无法理解haskell是如何自动匹配列表头被提取的模式的。
head' :: [a] -> a
head' [] = error "Can't find head in an Empty list!"
-- How does haskell break the list into x(first) and xs(rest)?
head' (x:xs) = x
我读过[1,2,3]是1:2:3:[]的语法糖。那么,:是一个函数,它接受任何参数并添加到右侧参数?该列表如何向后爆炸成两个变量head和rest?[
给定Haskell中的以下树结构:
data Tree = Leaf Int | Node Int Tree Tree deriving Show
如何让Haskell返回预排序的数据列表?
例如,给定一棵树:
Node 1 (Leaf 2) (Leaf 3)
返回类似如下的内容:
preorder = [1,2,3]
您好,我在Haskell上有一个列表,其中有近10^15个Int,我正在尝试打印列表的长度。
let list1 = [1..1000000000000000] -- this is just a dummy list I dont
print list1 length -- know the actual number of elements
打印需要很长时间,有没有其他方法可以获得列表中元素的数量并打印该数量?
我对Haskell非常陌生,还没有完全理解它是如何工作的。在下面的方法中,我希望更改矩阵中的某个值,或者在Haskell中实现的列表列表。
setEntry :: [[Int]] -> Int -> Int -> Int -> [[Int]]
setEntry x i j aij =
到目前为止,这是我的方法。我知道这并不多,但我真的不知道怎么继续下去。
计划是给它一个矩阵,然后将在ith行和jth列中可以找到的值更改为aij。
我将非常感谢任何帮助。
谢谢你已经提前了!
我刚从Python开始。以前有过Haskell。在Haskell,我大部分时间都在列表上工作。在Python中,我想这样做。
我有一份清单:
l = [1,2,3,4]
如何在列表中添加这4个元素,从而得到10个结果(1+2+3+4)
我需要一个递归函数和一个迭代(不像迭代那样干净和稳定,但无论如何)。
我在Haskell做了这件事:
sum [] = 0
sumlist(x:xs) = x + sumlist xs
在Python中,我尝试了这样的方法:
def sumlist(l)
if l == 0: #or Nil, i do not know
result 0
我正在尝试创建一个Pos (自定义)类型列表,但始终得到以下错误:
Not in scope: type constructor or class `List'
代码:
import Data.List
type Pos = (Int, Int)
type PlayList = List Pos
错误出现在我定义类型PlayList的行中。
有什么想法吗?在EclipseFP中使用Haskell
假设有用于输出所有组合的嵌套for循环的动态数
在本例中,有3个嵌套的forloop,用于生成所有组合的列表,如1、2、3、1、3、5等。
如果有N个嵌套的how循环,如何在haskell中使用递归来做?
伪码
for i from 1 to 5 do
for j from 1 to 10 do
if i < j then
for k from 1 to 50 do
if j < k then
list1 :: [i,j,k]
未完成的has循环有编译错误。
forl
我正在尝试编写一个Haskell函数,它返回列表中的第一项。
h [] = Nothing
h (x:xs) = x
当我用一个空列表调用它时:
main = print (h [])
我得到了以下错误:
prog.hs:4:8:
No instance for (Show a0) arising from a use of `print'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)