我看过的许多Haskell教程几乎完全集中在语法上,而对如何构建程序的报道却很少.
例如...
这是C++应用程序的简要概述:
#include <iostream>
using namespace std;
int addition (int a, int b)
{
int r;
r=a+b;
return (r);
}
int main ()
{
int z;
z = addition (5,3);
cout << "The result is " << z;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我第一次开始学习C++时,这些例子极大地帮助我学习如何将各个部分组合成工作程序.也许我正在寻找错误的地方,但我找不到任何像Haskell那样直接和简单的例子.
我已经知道很多Haskell语法.我可以编写递归列表推导,并操纵字符串,整数和列出wazoo.
简而言之:我只想知道Haskell中两个子例程和变量传递是什么样的.如果我能够对如何构造Haskell程序有一些基本的了解,我可能最终能够将我学到的所有语法都用于某些用途.
是否可以将此代码转换为列表理解?
for i in userInput:
if i in wordsTask:
a = i
break
Run Code Online (Sandbox Code Playgroud)
我知道如何转换它的一部分:
[i for i in userInput if i in wordsTask]
Run Code Online (Sandbox Code Playgroud)
但我不知道如何添加休息,文档也没有多大帮助.
任何帮助,将不胜感激.
是否有可用的方法或库可以加载图像(jpeg,png等)并将该图像的像素值分配到列表或矩阵中?我想做一些图像和模式识别的实验.
在正确的方向稍微推动将不胜感激.
我一直试图想出一种简单直观的方法来使用Haskell数据库.我从Yesod书中获取了这些代码并试图将其清理干净,以便更容易理解和使用.
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-}
{-# LANGUAGE GADTs, FlexibleContexts #-}
import Database.Persist
import Database.Persist.Sqlite (withSqliteConn, runSqlConn, runMigration)
import Database.Persist.TH (share, mkPersist, mkMigrate, sqlSettings, persist)
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Person -- Table name
name String -- String value
age Int Maybe -- Numerical value
|]
updateDB x y = withSqliteConn "data.db" $ runSqlConn $ do
runMigration migrateAll -- Creates "Person" table if one doesn't exist
insert $ Person x $ Just y -- Inserts …
Run Code Online (Sandbox Code Playgroud) 经过一年多的精神争吵,我终于明白了Haskell,认为它是我的大部分编程需求的主要语言.我非常喜欢它.
但我仍然在努力以功能的方式进行非常具体的操作.
一个简化的例子:
Set = [("Bob", 10), ("Megan", 7), ("Frank", 2), ("Jane", 11)]
Run Code Online (Sandbox Code Playgroud)
我想将这些条目相互比较.使用像C或Python这样的语言,我可能会创建一些复杂的循环,但是我不确定哪种方法(map,fold,list comprehension?)对于函数式语言来说是最好的还是最有效的.
这是我开始研究的代码示例:
run xs = [ someAlgorithm (snd x) (snd y) | x <- xs, y <- xs, x /= y ]
Run Code Online (Sandbox Code Playgroud)
谓词使列表理解不会将条目与自身进行比较,但该函数效率不高,因为它比较了已经比较的条目.例如.它会将Bob与Megan进行比较,然后将Megan与Bob进行比较.
如何解决这个问题的任何建议将不胜感激.
comparison performance haskell functional-programming dataset
回到故事:为了更好地理解Haskell和函数式编程,我给自己做了一些任务.我的第一个任务是创建一个程序,可以查看数据集(一组数字,博客中的单词等),搜索模式或重复,对它们进行分组并报告它们.
听起来很容易.:)
问题:我希望程序首先从文本文件中的数据创建列表变量.我熟悉readFile函数,但我想知道是否有更优雅的方式来输入数据.
例如,我想允许用户在命令行中输入类似的内容来加载程序和数据集.
./haskellprogram textfile.txt
是否有允许这个功能的功能?
回到故事:我上周一直在努力解决这个问题,通过在线阅读Learn You A Haskell和教程,但我无法理解.
我在理解列表理解和递归方面取得了很大的进步,但是这个问题仍然存在于我的方向.
问题:我正在尝试将String(或我认为是String)转换为分割列表.这是我到目前为止的代码(再次感谢Jan的帮助).它导入.txt文件的内容.
import System.Environment
main :: IO ()
main = do
args <- getArgs
if null args
then putStrLn "usage: ./pattern dataset.txt"
else do contents <- readFile $ head args
putStrLn $ "Filer1: " ++ filterLower(contents)
convert' contents
filterLower :: String -> String
filterLower st = [ c | c <- st, c `elem` ['A'..'Z']]
Run Code Online (Sandbox Code Playgroud)
我尝试制作自己的转换功能:
convert' :: String -> [String]
convert' x = (x:[])
Run Code Online (Sandbox Code Playgroud)
它可以工作,但它不适用于这个问题.
任何帮助,将不胜感激.
错误:这是我经常收到的错误.
Couldn't match expected …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个加载2个文本文件的程序,将这些文件中的数字转换为2个列表,然后计算这些列表之间的皮尔逊相关性.
pearson函数只能使用浮点数,所以我创建了一个名为floatconvert的函数来尝试解决这个问题,但事实并非如此.我收到错误消息"无法将预期类型'IO b0'与实际类型'Float匹配'.在'pearson'的第一个参数中,即'input1'."
任何有关解决此问题的帮助将不胜感激.
main = do
input1file <- readFile "input1.txt"
input2file <- readFile "input2.txt"
let input1 = floatconvert input1file
let input2 = floatconvert input2file
pearson input1 input2
floatconvert x = [ read a::Float | a <- words x ]
pearson xs ys = (psum-(sumX*sumY/n))/(sqrt((sumXsq-(sumX**2/n)) * (sumYsq-(sumY**2/n))))
where
n = fromIntegral (length xs)
sumX = sum xs
sumY = sum ys
sumXsq = sum([ valX*valX | valX <- xs ])
sumYsq = sum([ valY*valY | valY <- ys ])
psum …
Run Code Online (Sandbox Code Playgroud) 我在10分钟的教程中一直关注Learn Haskell.一切顺利,直到我到达这条线:
do { n <- readLn ; print (n^2) }
Run Code Online (Sandbox Code Playgroud)
它不会在ghci中执行,而在Leksah中我会收到以下错误.
解析错误:顶层的裸露表达
我已经尝试更新cabal并安装foo,但问题还在继续.
非常感谢您的帮助.
我正在使用Ubuntu 11.10.
这是我正在处理的代码的简化版本.
main :: IO ()
main = do
args <- getArgs
if null args
then putStr "> " ; userInput <- getLine
else userInput <- readFile $ head args
let conclusion = userInput
Run Code Online (Sandbox Code Playgroud)
如果不使用符号,这将无法工作,当我使用它时,变量将不会传递给下面的结论,而我正在尝试用来创建一种提示的putStr让它变得疯狂.
有什么东西我忘了添加到某个地方吗?
这是一个简单的,准确的例子,说明我试图用C++编写的代码.
while (state == true) {
a = function1();
b = function2();
state = function3();
}
Run Code Online (Sandbox Code Playgroud)
在我正在研究的程序中,我需要循环一些函数,直到bool 状态等于false(或直到其中一个变量,假设变量b,等于0).
如何在Haskell中完成此代码?我在这里搜索过,谷歌甚至Bing都没有找到关于如何使用函数重复操作的任何明确,直接的解释.
任何帮助,将不胜感激.
这是我拥有的3个数据集的简化版本:
Set A = [1, 1, 2, 2, 1, 2, 2, 1]
Set B = [2, 2, 1, 2, 2, 1, 1, 3]
Set C = [8, 4, 4, 4, 4, 9, 8, 4]
Run Code Online (Sandbox Code Playgroud)
Haskell是否具有用于在数据集之间查找未指定模式的任何内置功能?我想在2个或更多数据集上运行我的程序,并让它报告哪些数据类似,在这种情况下,它们将是集合A和B.
algorithm haskell cluster-analysis pattern-matching nearest-neighbor
为了回到C编程的流程,我一直在打字一些简单的测试程序.我遇到了scanf函数的一个奇怪问题.我在下面的代码中有3个,但只有前2个被初始化; 第三个scanf被忽略.这是正常的,还是我做错了什么?我一直在盯着这段代码过去半小时,我找不到任何错误.
#include <stdio.h>
int math(int a, int b, char selection) {
int result;
switch (selection) {
case 'a':
result = a + b;
break;
case 's':
result = a - b;
break;
case 'm':
result = a * b;
break;
case 'd':
result = a / b;
break;
}
return result;
}
int main() {
int num1 = 0;
int num2 = 0;
int result = 0;
char selection;
printf("Enter first number: ");
scanf("%i", &num1);
printf("Enter second number: "); …
Run Code Online (Sandbox Code Playgroud) haskell ×11
io ×4
algorithm ×2
if-statement ×2
c ×1
comparison ×1
database ×1
dataset ×1
for-loop ×1
function ×1
libraries ×1
linux ×1
list ×1
loops ×1
performance ×1
python ×1
recursion ×1
scanf ×1
shell ×1
string ×1
subroutine ×1
variables ×1
while-loop ×1
yesod ×1