我只是把我的脚趾浸入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!
我不仅仅是寻找答案,而是更多地解释它.
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:_)意思.
谢谢.
这是我在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不乙,没有一个!因为该 …
我按照这个答案中的建议开始学习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 …
哈斯克尔初学者在这里,对于这个愚蠢的问题提前抱歉.我来自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或类似的任何地方找到合适的函数.我确信这里有一些非常明显的东西.
这种技巧之一,当你不熟悉一种语言时,更难找到,但其他人都知道并使用它.
在我的情况下,我想知道当你有一个变量的名称时,它是什么意思,比如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的翻译是什么?
我们不得不在 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) 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,系统卡在那里.
我是哈斯克尔的新人.我的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)
任务:
创建一个Haskell语言程序,可用于执行任何与上述FDA定义相对应的任意确定性有限自动机.将DFA表示为四元组
一个.表示每个状态,其名称为String
湾 将所有州表示为州列表
C.将每个转换表示为三元组,将转换列表表示为列表.
为了帮助您,请在解决方案中实施以下功能:
一个.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 中指定不同语言结构的抽象语法的问题,例如变量声明、数组声明、if-else 语句等,但我对这意味着什么感到困惑。这只是 Haskell 中的样子吗?以下是我负责的语言构造之一:
var x = 10;:)
我尝试解决上述问题并写下: var = int | 布尔 | 细绳
当我负责以下语言结构时,我感到相当困惑:
我本质上只是问我是否正确理解这一点,因为我似乎在其他地方找不到任何例子,以及我是否可以获得任何提示来更好地帮助我理解。我也不确定这个网站是否是问这个问题的正确地方,因为它看起来比平时更加理论化,所以如果这是错误的地方,请指出另一个可能更合适的论坛。预先感谢您的任何帮助。
haskell ×10
types ×3
lambda ×2
abstract ×1
arguments ×1
declarative ×1
dfa ×1
identifier ×1
iteration ×1
list ×1
loops ×1
recursion ×1
state-monad ×1
syntax ×1