考虑以下Haskell函数:
sign a
| a < 0 = (-1)
| a > 0 = 1
| otherwise = 0
Run Code Online (Sandbox Code Playgroud)
当我把它加载到ghci我希望:t sign是:
sign :: (Num a, Ord a) => a -> Integer
Run Code Online (Sandbox Code Playgroud)
相反,它推断为:
*Main> :t sign
sign :: (Num a1, Num a, Ord a1) => a1 -> a
Run Code Online (Sandbox Code Playgroud)
同样,如果我要求整数的类型5,我期望Integer,但我得到了
*Main> :t 5
5 :: Num a => a
Run Code Online (Sandbox Code Playgroud)
我不了解Haskell的类型.问题是,如果我所知道的返回类型sign是它是Num类型类的一个实例,那么我不应该将它的返回值传递给这个函数:
double :: Integer -> Integer
double x = x * 2
Run Code Online (Sandbox Code Playgroud)
也就是说,我的 …
我的一些代码被最新版本的ghc 7.8.2打破了.
我GeneralizedNewtypeDeriving用来派生Data.Vector.Unbox使用以下内容的实例:
data VoxelPos = VoxelPos
{-# UNPACK #-} !Int
{-# UNPACK #-} !Int
{-# UNPACK #-} !Int
deriving (Show, Eq, Ord)
newtype FacePos = FacePos VoxelPos deriving ( Eq, Hashable, NFData, G.Vector U.Vector, M.MVector U.MVector, U.Unbox)
Run Code Online (Sandbox Code Playgroud)
哪里VoxelPos有手动滚动的实例使用(Int, Int, Int):
newtype instance U.MVector s VoxelPos = MV_VoxelPos (U.MVector s (Int, Int, Int))
newtype instance U.Vector VoxelPos = V_VoxelPos (U.Vector (Int, Int, Int))
instance U.Unbox VoxelPos
instance M.MVector U.MVector VoxelPos where
basicLength …Run Code Online (Sandbox Code Playgroud) 以下Haskell代码是一个简单的"控制台IO"DSL:
data Ap a = Ap { runAp :: ApStep a }
data ApStep a =
ApRead (String -> Ap a)
| ApReturn a
| ApWrite String (Ap a)
ioRead k = Ap $ ApRead k
ioReturn a = Ap $ ApReturn a
ioWrite s k = Ap $ ApWrite s k
ioWriteLn s = ioWrite (s ++ "\n")
apTest =
ioWriteLn "Hello world!" $
ioRead $ \i ->
ioWriteLn ("You wrote [" ++ i ++ "]") $
ioReturn 10 …Run Code Online (Sandbox Code Playgroud) 纯粹是为了愉悦和练习,我试图编写一个简单的Haskell函数来确定整数是否是一个完美的正方形.现在我知道还有其他解决方案,但我想知道是否有办法用无限列表来做到这一点.我从这开始,但由于明显的原因,它不起作用(它永远不会停止!)
isSquare :: Integer -> Bool
isSquare n = sum[ 1 | x <- [1..], x*x == n] /= 0
Run Code Online (Sandbox Code Playgroud)
此外,如果我可以添加,有人可以指出如何搜索无限列表的第一个实例然后停止!?
对不起,如果这是一个常见的问题.我有这个简单的IO()功能:
greeter :: IO()
greeter = do
putStr "What's your name? "
name <- getLine
putStrLn $ "Hi, " ++ name
Run Code Online (Sandbox Code Playgroud)
现在我想调用greeter并同时指定一个预先填充的参数getLine,这样我实际上不需要进行交互.我想象一个像功能的东西
IOwithinputs :: [String] -> IO() -> IO()
Run Code Online (Sandbox Code Playgroud)
那我就做
IOwithinputs ["Buddy"] greeter
Run Code Online (Sandbox Code Playgroud)
这将产生一个IO动作,不需要用户输入,看起来像:
What's your name?
Hi, Buddy
Run Code Online (Sandbox Code Playgroud)
我想这样做而不修改原始IO()功能greeter.我也不想greeter从命令行编译和管道输入.IOwithinputs在Hoogle中我没有看到任何类似的东西.(withArgs引人入胜地命名和命名,但根本不是我想要的.)有一个简单的方法吗?或者由于某种原因它是不可能的?这是Pipes的用途吗?
我正在读Bartosz Milewski撰写的一篇文章,其中他定义了以下功能:
instance Applicative Chan where
pure x = Chan (repeat x)
(Chan fs) <*> (Chan xs) = Chan (zipWith ($) fs xs)
Run Code Online (Sandbox Code Playgroud)
为什么函数应用程序运算符在括号中?我理解这通常是为了在前缀表示形式中使用中缀函数,但我不明白为什么,在这种情况下,函数不能简单地表达为Chan (zipWith $ fs xs),并想知道它之间的区别是什么二是.
(如果您仍需要上下文,请参阅文章)
data Tree a = Tree a [Tree a]
Run Code Online (Sandbox Code Playgroud)
请注意,我们不允许空树,并且叶子是具有空子列表的树.
treeFold :: (a -> [b] -> b) -> Tree a -> b
treeFold f (Tree x s) = f x (map (treeFold f) s)
Run Code Online (Sandbox Code Playgroud)
鉴于上述信息,我不明白树折叠函数如何通过递归地将折叠操作应用于子树,然后将函数应用于根处的标签以及从子树返回的结果来返回结果.
我也没有得到树Fold函数如何只接受一个参数而不是2,当它作为参数传递给map函数并且它仍然编译并正确运行时.
例如,下面的树大小函数计算树的节点.
treeSize :: Tree a -> Int
treeSize = treeFold (\x ys -> 1 + sum ys)
Run Code Online (Sandbox Code Playgroud)
因此运行treeSize树,其中树tree = Tree 4 [Tree 1 [Tree 2 [], Tree 3 []]]的大小为4.
在上面的树大小函数中,树折函数也传递一个参数而不是两个.另外,传递给树折函数的x并没有在任何地方使用,所以为什么你需要它.删除它会导致程序无法编译,并提供以下错误消息.
Couldn't match type `a' with `[[Int] …Run Code Online (Sandbox Code Playgroud) 在Haskell中,[a]的默认排序,给定a的排序,似乎是一个词典排序(侧面问题:我在哪里可以找出是否真的如此)?我想要的是一个分级的词典排序(也称为"长度加词典"排序).
我如何指定我希望以分级的词典编纂方式进行比较?我只想要一种类型,而不是所有[a].我试过这个:
instance Ord [Int] where
compare xs ys = case compare (length xs) (length ys) of
LT -> LT
GT -> GT
EQ -> lexicographic_compare xs ys
Run Code Online (Sandbox Code Playgroud)
但收到此错误消息:
> [1 of 1] Compiling Main ( test.hs, interpreted )
test.hs:1:10:
Illegal instance declaration for `Ord [Int]'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances …Run Code Online (Sandbox Code Playgroud) 尝试使用新元素替换给定点的列表中的元素,然后返回该元素.
setelt :: Int -> [a] -> a -> [a]
setelt x (yf:(y:yl)) z
| x == (length yf) = (yf:(z:yl))
Run Code Online (Sandbox Code Playgroud)
结果出现此错误:
Inferred type is not general enough
Expression : setelt
Expected type : Int -> [a] -> a -> [a]
Inferred type : Int -> [[a]] -> [a] -> [[a]]
Run Code Online (Sandbox Code Playgroud)
似乎没有连接的问题yf:y:yl所以不确定如何解决.
我正在尝试熟悉Haskell的Happy parser生成器.目前,我有一个文档的例子,但是当我编译程序时,我收到一个错误.这是代码:
{
module Main where
import Data.Char
}
%name calc
%tokentype { Token }
%error { parseError }
%token
let { TokenLet }
in { TokenIn }
int { TokenInt $$ }
var { TokenVar $$ }
'=' { TokenEq }
'+' { TokenPlus }
'-' { TokenMinus }
'*' { TokenTimes }
'/' { TokenDiv }
'(' { TokenOB }
')' { TokenCB }
%%
Exp : let var '=' Exp in Exp { \p -> $6 (($2,$4 …Run Code Online (Sandbox Code Playgroud) 我在Haskell中有一个10元组的列表,我想从元组列表中获得第n个元组.但正如我所看到的,只有长度函数与该列表一起使用.头,尾或!! 功能不起作用.你能告诉我该怎么办?元组由整数和字符串组成.例如,当我尝试这个:
tail [(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8")]
Run Code Online (Sandbox Code Playgroud)
我从拥抱中收到此错误消息:
ERROR - Cannot find "show" function for:
*** Expression : tail [(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8")]
*** Of type : [(Integer,Integer,[Char],[Char],[Char],[Char],[Char],[Char],[Char],[Char])]
Run Code Online (Sandbox Code Playgroud)