小编C. *_*ann的帖子

Haskell:根据第一个值查找列表中元组的第二个值

我在这里有一个函数,用于查看元组列表,并通过获取第一个值来查找元组中的第二个值.这是迄今为止的功能:

lookup :: String -> [(String,String)] -> String
lookup _ _ [] = "Not found"
lookup x y zs = if (notFound x zs)
    then "Not found"
    else (head [b | (a,b) <- zs, (a==x)])
Run Code Online (Sandbox Code Playgroud)

如果没有包含给定第一个字符串的元组,则notFound函数只返回一个Bool为true.问题是,我在Hugs中遇到这种类型的错误:

ERROR "find.hs" (line 22): Type error in explicitly typed binding
*** Term           : lookup
*** Type           : String -> [(String,String)] -> [a] -> String
*** Does not match : String -> [(String,String)] -> String
Run Code Online (Sandbox Code Playgroud)

我认为它与虚拟的"未找到"值有关,它与生成列表中的字符串具有不同的类型,但我不确定.

search haskell list

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

C#中的显式方法表而不是OO - 好吗?坏?

我希望标题听起来不太主观; 我绝对不是要开始就OO进行辩论.我只想讨论解决以下问题的不同方法的基本利弊.

让我们来看一个这个最小的例子:你想表达一个抽象数据类型T,其函数可以将T作为输入,输出或两者:

  • f1:取一个T,返回一个int
  • f2:取一个字符串,返回一个T.
  • f3:取T,返回另一个T.

我想避免向下转发和任何其他动态类型.我也想尽可能避免变异.

1:基于抽象类的尝试

abstract class T {
  abstract int f1();
  // We can't have abstract constructors, so the best we can do, as I see it, is:
  abstract void f2(string s);
  // The convention would be that you'd replace calls to the original f2 by invocation of the nullary constructor of the implementing type, followed by invocation …
Run Code Online (Sandbox Code Playgroud)

c# oop generics polymorphism functional-programming

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

如何在搜索树上定义地图和折叠?

我有一个搜索树,定义为:

data (Ord a) => Stree a = Null | Fork (Stree a) a (Stree a) deriving Show 
Run Code Online (Sandbox Code Playgroud)

我必须定义两个函数,mapStree:

mapStree :: (Ord b, Ord a) => (a -> b) -> Stree a -> Stree b
Run Code Online (Sandbox Code Playgroud)

和foldStree:

foldStree :: (Ord a) => (b -> a -> b -> b) -> b -> Stree a -> b
Run Code Online (Sandbox Code Playgroud)

我不完全了解发生了什么,也不知道该怎么做.

tree search haskell higher-order-functions

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

Haskell奇怪的回归

checkstring :: [String] -> Int -> [String]
checkstring p n = do    z <- doesFileExist (p !! n)
    if z
    then p
    else error $ "'" ++ (p !! n) ++ "' file path does not exist"
Run Code Online (Sandbox Code Playgroud)

它通过查看"n"检查字符串中的元素(因此,如果n = 2,它将检查列表中的第二个字符串),然后查看它是否存在.如果它确实存在,它将返回原始字符串列表,如果不存在则会出错.为什么这样做?:

Couldn't match expected type `[t0]' with actual type `IO Bool'
    In the return type of a call of `doesFileExist'
    In a stmt of a 'do' expression: z <- doesFileExist (p !! n)
Run Code Online (Sandbox Code Playgroud)

haskell haskell-platform

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

复制Haskell列表中的每个元素

by functions如何复制列表的每个元素两次.例如,重复[1,3,5]应该返回[1,1,3,3,5,5]

并用列表中的其他元素替换元素.例如,替换3 30 [1, 3 ,4 ,5, 3, 4]应返回[1, 30, 4, 5, 30, 4]

我在Haskell很新,需要今天提交作业.

任何帮助将不胜感激 !

haskell

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

Haskell类型错误消息

在过去的几天里,我一直在努力学习Haskell.虽然我正在慢慢变好,但我发现很难用Haskell的IO来推理,可能是因为我缺乏知识.我一直在尝试编写一个简单的待办事项列表程序.这是我得到的:

tadd todo = do
    td <- getLine
    td:todo

tdel todo = do
    trem <- getLine
    let rid = read trem :: Int
    [todo !! x | x <- [0..(length todo-1)], not $ x == rid]

tls todo = do
    mapM putStrLn [ (show x) ++ (todo !! x) | x <- [0..(length todo -1)] ]
    todo

mtodo "add" todo = tadd todo
mtodo "del" todo = tdel todo
mtodo "ls"  todo = tls todo


bege = do
    com <- …
Run Code Online (Sandbox Code Playgroud)

haskell types typeerror

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

Haskell中的符号简化(使用递归?)

我如何给出包含以下所有表达式的一般规则?例如一个表达式,另一个用于sub,一个用于mult.我需要使用递归,但我感到困惑......

simplify :: Expr->Expr

simplify (Mult (Const 0)(Var"x"))
 = Const 0 
simplify (Mult (Var "x") (Const 0))
 = Const 0
simplify (Plus (Const 0) (Var "x")) 
= Var "x"
simplify (Plus (Var "x") (Const 0))
 = Var "x" 
simplify (Mult (Const 1) (Var"x")) 
= Var "x"
simplify (Mult(Var"x") (Const 1))
 = Var "x" 
simplify (Minus (Var"x") (Const 0))
 = Var "x"
simplify (Plus (Const x) (Const y)) 
= Const (x + y)
simplify (Minus (Const x) (Const y))
= Const …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming

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

Haskell:用关联列表中的给定键替换元素

我必须创建一个函数,它给出一个键(作为a String),一个值(作为a String)和一个键和值的关联列表(as [(String, String)]).该函数用于将键/值对添加到列表的末尾,如果键已经存在于具有关联值的列表中,则删除旧值.

我已经尝试使用lookup键和关联列表,但我不知道如何处理输出 - lookup函数的输出类型是Maybe String,我似乎无法对其执行列表函数(如删除元素) .有什么方法可以查看列表并删除任何具有给定键的列表元素,而不知道与之关联的值?

haskell list

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

Mod Haskell作业

我的作业是提供一个函数来计算'x ^ y mod n' - 任何n <(sqrt maxint32)

所以我开始写这样做:

modPow :: Int -> Int -> Int -> Int 
modPow x y n = (x `mod` n) ^ (y `mod` n) `mod` n
Run Code Online (Sandbox Code Playgroud)

对于任何数量的n,这似乎工作正常,虽然我的下一个作业问题涉及使用x ^ n mod n = x(Camichael数字),我永远无法让modPow工作.

所以我使用伪代码进行另一个modPow进行mod取幂,来自维基百科:

modPow2 :: Int -> Int -> Int -> Int 
modPow2 x y n 
 = loopmod 1 1
  where
   loopmod count total = if count > y
                          then total
                           else loopmod (count+1) ((total*x) `mod` n)
Run Code Online (Sandbox Code Playgroud)

现在正确地为我的下一个问题产生正确答案,(x ^ n mod n …

haskell

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

总计函数(高阶函数)

我需要定义这个名为total的函数.

total :: (Int -> Int) -> Int -> Int
Run Code Online (Sandbox Code Playgroud)

因此总f是在值n给出和f0 + f1 + .... + fn的函数

谢谢你的帮助!请.


根据这本书作为一个例子,我发现了关于功能组成:

twice f = (f . f)   
Run Code Online (Sandbox Code Playgroud)

这里,f是一个函数,结果是f由它自己组成.为此,它需要具有相同的输入和输出类型.所以我们有

twice :: (a -> a) -> a -> a
Run Code Online (Sandbox Code Playgroud)

这表明两次接受一个参数,类型(a - > a)的函数,并返回相同类型的结果.例如,如果successor是将一个添加到整数的函数,

successor :: Int -> Int
successor n = n + 1     
then
(twice successor) 12 ->(successor . successor) 12 
-> successor (successor 12) -> 14
Run Code Online (Sandbox Code Playgroud)

haskell

-3
推荐指数
2
解决办法
257
查看次数