虽然我觉得自己对Haskel IO和Monad有很好的理解,但是我很难理解下面的错误信息。
考虑Haskell中的以下简单函数
testf :: Show a => a -> String
testf x = show x
我尝试通过使用IO Monad实现将输出到控制台的变体。
printtoscreen :: Show a => a -> IO()
printtoscreen x = putStrLn . show x
但是,这会产生以下错误:
无法匹配类型‘Char’与‘a0 ->字符串’预期类型:a0 ->字符串实际类型: String
正确的版本
在Haskell中,我试图打印一个返回Int的方法。就目前而言,mySum只是一个存根,因为我正在试图找出如何打印它。
我查了一下如何做到这一点,我看到putStr可以打印String并显示将Int转换成String,所以我这样做了:
mySum :: [Int] -> Int
mySum _ = 0
main = putStr show mySum [1..5]
然而,我发现了这些错误:
Couldn't match expected type ‘([Int] -> Int) -> [Integer] -> t’
with a
我很难理解这个Haskell表达式是如何工作的:
import Control.Monad
import System.IO
(forM_ [stdout, stderr] . flip hPutStrLn) "hello world"
. flip hPutStrLn部分到底在做什么?类型签名看起来很复杂:
ghci> :type flip
flip :: (a -> b -> c) -> b -> a -> c
ghci> :type (.)
(.) :: (b -> c) -> (a -> b) -> a
我在Haskell中有以下函数
agreeLen :: (Eq a) => [a] -> [a] -> Int
agreeLen x y = length $ takeWhile (\(a,b) -> a == b) (zip x y)
我正在努力学习如何编写“惯用的”Haskell,它似乎更喜欢使用.和$,而不是括号,并且在可能的情况下更喜欢无指针的代码。我似乎不能摆脱明确提到x和y。有什么想法吗?
我想我也会遇到同样的问题,去指向包含两个参数的任何函数。
顺便说一句,这只是为了写出好的代码;而不是一些“不惜一切代价让它变得无关紧要”的作业练习。
谢谢。
(添加评
我正在努力学习Haskell以适应函数式编程语言。我决定先在上尝试几个问题。我在读取stdin和使用haskell的lazy io执行io时遇到了问题。
大多数问题都有来自stdin的数据,格式如下:
n
data line 1
data line 2
data line 3
...
data line n
其中n是来自stdin的后续行数,下一行是数据。
如何在n行中的每一行上运行程序,并将解决方案返回给stdout?
我知道stdin输入不会很大,但我要求每次计算一行,假装输入大于内存中可以容纳的大小,只是为了学习如何使用haskell。
我正试着和Haskell一起自学。
函数loadData从文件中读取一些数据,并基于一个整数参数对其进行一些处理,以生成一个映射。我需要创建两个这样的地图,并对其应用余弦相似性度量。我正在尝试首先找到这两个地图的交集。但是,我遇到了类型错误(Couldn't match expected type `a0 -> Map.Map k0 a1' with actual type `IO (Map.Map [Char] Double)')如何将loadData的输出提供给Map.intersection。我需要一个函数应用程序$吗?
loadData :: Int -&
通过虚线下的程序部分,计算出一个素数的所有素因子,并输出。程序中虚线上的部分得到了从2到无穷大的素数。 错误发生在以下行中 |npf m primnumber == True = head primnumber ++ (primfactor (m / head primnumber):[]) 警告显示为: E:\Haskell\Uebungsblatt_2_Aufgabe_1.hs:17:33: error:
* Couldn't match expected type `[[Int]]' with actual type `Int'
* In
我对haskell非常陌生,我已经开始阅读“haskell中的编程”一书。我偶然发现了一个叫做交换的函数
swap (x,y) = (y,x)
以及函数对。
pair x y = (x,y)
然后我开始怀疑是否有可能像这样把这两种功能结合起来。
swapPair x y = (y,x)
并使用两个priar函数作为帮助函数。
我正在学习Haskell和Yampa,有一个关于反应函数的问题。
reactimate :: IO a -- init
-> (Bool -> IO (DTime, Maybe a)) -- sense
-> (Bool -> b -> IO Bool) -- actuate
-> SF a b -- signal function
-> IO ()
正如您在类型签名中看到的,sense函数的部分输出是该函数的当前调用和上一次调用之间的时间差。在我已经看到的例子中,这个时间差是在sense内部“手
我的目标是编写Haskell函数,从输入中读取N行并将它们连接到一个字符串中。以下是第一次尝试:
readNLines :: Int -> IO String
readNLines n = do
let rows = replicate n getLine
let rowsAsString = foldl ++ [] rows
return rowsAsString
这里haskell对foldl的投诉
无法匹配预期的[a]' against inferred type(a1 -> b -> a1) -> a1 -> b ->
在下面的Haskell代码中,如何编写得更简洁?是否有必要列出所有四个条件,还是可以用更紧凑的模式加以概括?例如,我是否可以利用Haskell已经知道如何添加浮点和int的方法,而不必手动指定fromIntegral?
data Signal = SignalInt Int | SignalFloat Float | Empty deriving (Show)
sigAdd :: Signal -> Signal -> Signal
sigAdd (SignalInt a) (SignalInt b) = SignalInt (a + b)
sigAdd (SignalInt a
Haskell是如何解释表达式A._的?例如在main = print $ A._中。
Haskell抛出以下错误:
source_file.hs:1:16:
Found hole ‘_’ with type: r0
Where: ‘r0’ is an ambiguous type variable
Relevant bindings include
main :: IO ()
(bound at source_file.hs:1:1)
In the second argument of ‘($)’, namely ‘A._’
我不是很好的haskell程序员。我的任务是在我的大学写一个编译器,我选择了haskell,因为它是一个很好的工具。我使用的是monads和ExcepT,所以我有类型:
type Runner r s = StateT s (ExceptT LatteError IO) r
type RT r s = IO (Either LatteError (r, s))
我使用它创建、遍历程序树并生成asm代码,它可以按照我的意愿工作。作为行走树的主要功能,我使用
rProgram :: Program -> Runner [String] CompileState
为了解压结果,我使用函数
ru
我学习Haskell。Haskell中operator这个词的定义是什么?我找不到明确的定义。
我想是这样的(我自己的理解):
运算符是一个具有名称的函数,它只包含ascSymbol符号,而不是以:符号开头,并且只有两个参数。
来自Haskell 2010年的ascSymbol组包含:
#$%*+/<=>?@\ˆ|-˜:
但我不确定我是对的..。例如,在我看来,这就是运算符。
(!#$%&*+./<=>?@\^|-~:) :: Int -> Int -> Int
a !#$%&*+./<=>?@\^|-~: b =