为了了解haskell的工作原理,我创建了以下语句.我试图了解他们的类型是什么; 如果我是正确的轨道,任何人都可以告诉我吗?
statement type
['h', 'e', 'l', 'l', 'o'] ['h', 'e', 'l', 'l', 'o'] :: [char]
[(9,8),(7,6),(5,4)] [(9,8),(7,6),(5,4)] :: [int a, int b] => [(a,b)]
Run Code Online (Sandbox Code Playgroud)
如果这是正确的,有人可以帮我理解这些陈述的类型/功能:
even x = x 'mod' 1 == 1
chart x y = [y| x <- [1..x]]
我有数据类型:
data Posn a = Posn Int Int a
Run Code Online (Sandbox Code Playgroud)
我想为它创建一个自定义的Show实例,它将两个Int显示为有序对,如下所示:
showPosn :: Show a => Posn a -> String
showPosn (Posn l c x) = show (l,c) ++ (' ' : show x)
Run Code Online (Sandbox Code Playgroud)
我试过这个:
instance Show (Show a => Posn a) where
show = showPosn
Run Code Online (Sandbox Code Playgroud)
但这给了我错误"非法实例声明".
令人沮丧的是,deriving Show工作得很好.所以,我的问题是:我需要做什么才能获得我的Show实例?
我在屏幕左侧打开了一个 Haskell 文件,另一半打开了 ghci。我想在文件中添加函数、保存并在 ghci 中试验它们。问题是我不完全确定如何声明顶级函数。我什至不确定我知道什么是顶级函数。我认为它们只是最高范围的功能。所以我的问题是做到这一点的极简方式是什么?例如...
let f1 x = x
Run Code Online (Sandbox Code Playgroud)
我需要用什么样板代码来包围它才能编译它以便我可以在 ghci 中加载它?
我的输入是一个任意列表,例如
["a","b","c"]
Run Code Online (Sandbox Code Playgroud)
还有另一个列表元素"z".我希望输出看起来像:
[["z","b","c"],["a","z","c"],["a","b","z"]]
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
sumListV3功能怎么样?myFoldr需要3个args:function,base case num和list.然而它以某种方式知道列表(基于您的输入),即使它从未在内部代码中指定.
我认为sumListV2它是最简单的.sumListV3甚至如何编译,更不用说正常运行了?
myFoldr :: (a -> b -> b) -> b -> [a] -> b
myFoldr _ baseCase [] = baseCase
myFoldr f b (x:xs) = f x (myFoldr f b xs)
sumListV2 :: [Int] -> Int
sumListV2 xs = myFoldr (+) 0 xs
sumListV3 :: [Int] -> Int
sumListV3 = myFoldr (+) 0
Run Code Online (Sandbox Code Playgroud) 为什么会出错
proba.hs:5:28: Not in scope: type variable `<stderr>: commitBuffer: invalid argument (invalid character)
Run Code Online (Sandbox Code Playgroud)
尝试使用以下代码编译文件proba.hs时出现:
main :: IO()
main = do
print (isBalanced (Node 17 (Node 14 Empty Empty) (Node 20 (Node 20 Empty Empty) (Node 20 Empty Empty))) 2)
data Tree a = Empty | Node ? (Tree a) (Tree a)
deriving (Read, Show)
depth :: Tree a -> Int
depth Empty = 0
depth (Node _ t1 t2) = 1 + max (depth t1) (depth t2)
isBalanced :: Tree …Run Code Online (Sandbox Code Playgroud) 我一直在努力花一个小时来理解更高阶函数中的一些东西,现在我因为这个错误而无法继续前进:
hof :: [Integer] -> (Integer -> Integer)
isIn :: [Integer] -> Integer -> Integer
isIn [] s = 0
isIn [] _ = 0
isIn (h:t) s
| h == s = 0 {-<-------- error points here here-}
| otherwise = isIn(t) + 1
hof s = \n -> isIn s n
ERROR file:.\Lab2.hs:111 - Type error in explicitly typed binding
*** Term : isIn
*** Type : [Integer] -> Integer -> Integer -> Integer
*** Does not match …Run Code Online (Sandbox Code Playgroud) 有没有办法在 Haskell 中模仿 TypeScript 的可区分类型联合?我想做以下事情:
data A = B | C | D
data W = X | Y | Z
data FinalType = A | W
Run Code Online (Sandbox Code Playgroud)
我知道最后一个定义将创建两个值构造函数A和Wfor FinalType. 我现在可以通过FinalType以下方式正确制作:
data FinalType = B | C | D | X | Y | Z
Run Code Online (Sandbox Code Playgroud)
但这不是很整洁,并且在添加了大量值构造函数后变得很烦人。有没有办法在 Haskell 中缓解这种情况?
我正在尝试在 haskell 中的列表的每个元素上应用一个函数。因此我正在使用该map功能。我的代码应该将下一个元素的值添加到当前元素。
所以我认为我的代码应该看起来像这样:
test :: [Rational]
test = map (\x -> x % {-somehow get next element -}) listT
Run Code Online (Sandbox Code Playgroud)
listT 是一个 Int 类型的无限列表。
但是我如何“访问”下一个值?谢谢你的帮助