相关疑难解决方法(0)

学习Haskell映射,折叠,循环和递归

我只是把我的脚趾浸入Haskell的世界,作为我的编程启蒙之旅的一部分(从程序到OOP再到并发到现在的功能).

我一直在尝试在线Haskell评估员.

但是我现在遇到了一个问题:

创建一个简单的函数,它给出一组数字的总和.

在程序语言中,这对我来说很容易(使用递归)(c#):

private int sum(ArrayList x, int i)
{
  if (!(x.Count < i + 1)) {
        int t = 0;

        t = x.Item(i);
        t = sum(x, i + 1) + t;
        return t;
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都非常好但是我在Haskell的失败尝试是这样的:

let sum x = x+sum  in map sum [1..10]
Run Code Online (Sandbox Code Playgroud)

这导致以下错误(来自上述网站):

Occurs check: cannot construct the infinite type: a = a -> t
Run Code Online (Sandbox Code Playgroud)

请记住,我过去30分钟只使用过Haskell!

我不仅仅是寻找答案,而是更多地解释它.

recursion haskell types functional-programming

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

(x:_)和[x:_]是什么意思?

head' :: [a] -> a
head' [] = error "No head for empty lists!"
head' (x:_) = x

head' :: [a] -> a
head' xs = case xs of [] -> error "No head for empty lists!"
                      (x:_) -> x
Run Code Online (Sandbox Code Playgroud)

我要求一个相当容易的问题,我不明白.在上面的代码中,我看到它需要一个输入列表.但在第三行,它说(x:_)哪些让我感到困惑.任何人都可以向我解释为什么他们写(x:_)而不是[x:_]

而且,我不明白是什么(x:_)意思.

谢谢.

haskell list pattern-matching

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

Haskell:迭代状态,如何强制我想要的行为?

这是我在SO上的第一篇文章,我对Haskell相对较新,所以请原谅任何失误或者我的代码不是惯用的!

考虑以下两个直观的描述:a,f(a),f(f(a))......

A. 一个包含以下内容的列表:a,应用f到a,应用f到那个,应用f到那个 ...

B. 一个列表,在第i个位置包含嵌套的应用程序f到a.

我的问题是我试图iterate在Haskell中使用该函数来做A烧毁.我的真实应用是模拟,但下面的人为例子突出了这个问题.

import Control.Monad.State

example :: State Int [[String]]

step :: [String] -> State Int [String]
step l = do
         currentState <- get
         let result = if (currentState == 1)
                          then "foo":l
                          else "bar":l
         put (currentState + 1)
         return result

example = do
          sequence $ take 3 . iterate (>>= step) $ return []
Run Code Online (Sandbox Code Playgroud)

有了这些定义,

evalState example 1
Run Code Online (Sandbox Code Playgroud)

结果是:

[[],["foo"],["bar","bar"]]
Run Code Online (Sandbox Code Playgroud)

显然,iterate,没有一个!因为该 …

iteration haskell loops state-monad

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

从当前签名或其他函数返回类型获取时,Haskell类型不会被视为相同

我按照这个答案中的建议开始学习Haskell .所以我只是实现了简单的列表函数,我偶然发现了编译器行为的不同,我无法向自己解释:

-- Impl 1
elementAt :: (Integral b) => [a] -> b -> a
elementAt xs id = xs !! (fromIntegral(id-1))

-- Impl 2
elementAt' :: (Num b) => [a] -> b -> a
elementAt' xs id = xs !! (id-1)
Run Code Online (Sandbox Code Playgroud)

使用以下签名:

fromIntegral :: (Integral a, Num b) => a -> b
(!!) :: [a] -> Int -> a
Run Code Online (Sandbox Code Playgroud)

我只在第二次实现时遇到错误elementAt'.

Could not deduce (b ~ Int)
from the context (Num b)
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,则意味着运算符(!!)期望将Int实例作为其第二个参数(从签名中看到),但我们只保证提供的参数符合Num …

haskell types

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

如何从Haskell对象中获取数据?

哈斯克尔初学者在这里,对于这个愚蠢的问题提前抱歉.我来自Python,只是想知道如何从Haskell数据类型中获取数据(即字符串).

假设我使用的是RDF图rdf4h,我可以从中获取一个Node对象.这就是我的print样子:

LNode (PlainL "Stories from the Italian Poets: with Lives of the Writers, Volume 1")
Run Code Online (Sandbox Code Playgroud)

如何从中获取字符串值?(即,"来自...的故事")我搜索了Hoogle,:: Node -> Text但我似乎无法找到任何东西.我似乎也无法在Data.RDF.Types或类似的任何地方找到合适的函数.我确信这里有一些非常明显的东西.

haskell

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

Haskell标识符中\的含义

这种技巧之一,当你不熟悉一种语言时,更难找到,但其他人都知道并使用它.

在我的情况下,我想知道当你有一个变量的名称时,它是什么意思,比如ts,你把符号放在\它之前:

newtype Parser a = Parser (String -> [(String, a)])
produce :: a -> Parser a
produce x = Parser (\ts -> [(ts, x)])
Run Code Online (Sandbox Code Playgroud)

我猜这是抽象变量?如果是这样,那么它对其他语言如Scala的翻译是什么?

lambda haskell identifier

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

HASKELL lambda 表达式 '\ xs -&gt; ...' 有一个参数,但它的类型 '[t]' 没有

我们不得不在 Haskell 中编写 lambda 函数,但它总是显示错误。我做错了什么?所有代码都有相同类型的错误,但我不明白如何使它们正确。

length' :: [a] -> [a] -> Int 
length' [] = 0
length' (x:xs) (y:ys) = \n -> if length (x:xs) > (y:ys) then 1 else if (x:xs) == (y:ys) then 0 else if (x:xs) < (y:ys) then -1

find :: a -> [a] -> Bool
find p [] = False
find p xs = \p -> if p `elem` xs then True else False

remove y [] = []
remove y (x:xs) = \xs -> …
Run Code Online (Sandbox Code Playgroud)

lambda haskell types arguments type-mismatch

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

haskell减去错误

answerFalse::Int->IO()
answerFalse hp=do
            hp--
            if hp<=0 then
                putStrLn"================Game Over================"

            else
                print(hp)
Run Code Online (Sandbox Code Playgroud)

我已经将hp声明为int值为3现在我的问题是当我输入"hp--"时,它显示错误

 Couldn't match expected type `IO a0' with actual type `Int'
Run Code Online (Sandbox Code Playgroud)

但如果我把"--hp",结果打印是3而不是2.

我也试过让hp = hp-1,系统卡在那里.

haskell

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

完成haskell命令的正确路径指南

我是哈斯克尔的新人.我的java知道如何帮助我很多.

我需要任何帮助或指导来完成代码.我已经尝试了大部分部分,并对我倾向于实现的目标发表评论.

DFA定义如下(DFA定义的原始图像):

Q = {q1,q2,q3,q4,q5}
qs = q1
F = {q4}
delta = {
  <q1,0,q2>,<q1,1,q2>,<q1,.,q3>,
  <q2,0,q2>,<q2,1,q2>,<q2,.,q4>,
  <q3,0,q4>,<q3,1,q4>,<q3,.,q5>,
  <q4,0,q4>,<q4,1,q4>,<q4,.,q5>,
  <q5,0,q5>,<q5,1,q5>,<q5,.,q5>
  }
Sigma = {0,1,.}
Run Code Online (Sandbox Code Playgroud)

任务:

  1. 创建一个Haskell语言程序,可用于执行任何与上述FDA定义相对应的任意确定性有限自动机.将DFA表示为四元组

    一个.表示每个状态,其名称为String

    湾 将所有州表示为州列表

    C.将每个转换表示为三元组,将转换列表表示为列表.

  2. 为了帮助您,请在解决方案中实施以下功能:

    一个.stateFactory - 返回DFA定义(即四元组)

    湾 allStates,firstState,finalStates和allTransitions - 获取DFA并返回DFA的相应组件.例如,在上面的DFA实例中,allStates将返回状态列表q 1,q 2,q 3,q 4和q 5.

    C.transFrom,transInput和transTo - 进行转换并返回转换的相应组件

    d.findTransition - 获取状态,标签和转换列表,并返回包含与给定状态和字符匹配的单个转换的列表(请注意,从状态发出的转换由每个字符标签唯一确定

    即 findNextState - 获取DFA,标签和状态并返回状态

    F.dfaAccept - 接受DFA和输入String,如果DFA接受输入则返回True,否则返回False(即,一次分解字符串一个字符,因为您的解决方案必须适用于任何DFA,所以不匹配整个字符串).将其分成两个函数是有帮助的,每个函数具有不同的参数集(一个用于空列表,一个用于非空列表).一个函数采用当前状态,一个函数只采用DFA,其状态被假定为DFA的初始状态.

这是我的代码有很多错误,但我正在尝试修复它们

allStates = ["q1","q2","q3","q4","q5"] -- iniitialize all states
firstState = "q1"
finalStates = "q4"

--define all transitions as a tuple

t1 = …
Run Code Online (Sandbox Code Playgroud)

haskell declarative dfa

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

如何在现有语言中指定不同语言结构的抽象语法?

我试图解决在 Haskell 中指定不同语言结构的抽象语法的问题,例如变量声明、数组声明、if-else 语句等,但我对这意味着什么感到困惑。这只是 Haskell 中的样子吗?以下是我负责的语言构造之一:

  • 变量声明
    • 无类型的
    • 变量声明还可以选择指定初始值(具体语法示例var x = 10;:)
      • 初始值只能是整数/布尔值/字符串文字

我尝试解决上述问题并写下: var = int | 布尔 | 细绳

当我负责以下语言结构时,我感到相当困惑:

  • 算术表达式
    • 原始表达式:
      • 有些被认为是理所当然的(即不需要指定):整数文字、布尔文字、字符串文字
      • 使用变量
      • 访问类成员
      • 索引数组元素
      • 函数调用
      • (可能需要其他原始表达式)因为我不确定如何开始。

我本质上只是问我是否正确理解这一点,因为我似乎在其他地方找不到任何例子,以及我是否可以获得任何提示来更好地帮助我理解。我也不确定这个网站是否是问这个问题的正确地方,因为它看起来比平时更加​​理论化,所以如果这是错误的地方,请指出另一个可能更合适的论坛。预先感谢您的任何帮助。

syntax haskell abstract

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